gpt4 book ai didi

c# - 动态类型化泛型类

转载 作者:太空宇宙 更新时间:2023-11-03 21:59:30 25 4
gpt4 key购买 nike

我有一个由 WebAPI 自动序列化的对象,但我想包装它以为我的数据提供上下文。一个例子是:

public class SecureModel<T>
{
public string Info { get; set; }
public T Data { get; set; }
}

这序列化/反序列化我的 JSON 请求没有问题,一切都很好。但是,我想在允许请求完成执行之前验证其中的一些信息,因此我添加了一个 ActionFilter,我在其中检索我的 POST 参数。

public class MyAuth : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var arg = actionContext.ActionArguments.FirstOrDefault().Value;
// arg: get the Info?
// if the info isn't correct, return a specific Response.
}
}

当我检查参数时,它正是我所需要的,但是我不知道如何在不指定实际 泛型的情况下将其弱类型化为 SecureModel。我觉得我应该能够将其发送给 SecureModel 并正确访问根目录,但它不允许这样做。到目前为止,我只能使用以下方法获取我需要的数据:

var notStrongEnough = arg.GetType().GetProperty("Info");

但是,我不想为此使用 Reflection,如果没有答案,我很难前进。在这种情况下,我的替代方案是将数据更改为字符串并手动序列化/反序列化 JSON 对象,但这违背了通过 MVC3 使用 Web API 的一些目的。

注意:将设计更改为将 SecureModel 作为基类会给我对数据执行的一些散列增加挑战,因此我也不想走这条路。

谢谢!

编辑标题措辞错误。

最佳答案

C# 中此类问题的典型解决方案是创建您的泛型类型实现的非泛型接口(interface)。例如,你的类(class):

public class SecureModel<T>
{
public string Info { get; set; }
public T Data { get; set; }
}

你可以定义一个接口(interface),ISecureModel:

public interface ISecureModel 
{
string Info { get; }
object Data { get; }
}

现在您可以在您的数据类中实现它:

public class SecureModel<T> : ISecureModel
{
public string Info { get; set; }
public T Data { get; set; }

object ISecureModel.Data {
get { return Data; }
}
}

我们在这里使用显式接口(interface)实现,因为属性 Data 的非泛型(object)和泛型(T)版本会发生冲突.

现在,要获取信息,您只需转换为 ISecureModel

关于c# - 动态类型化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com