gpt4 book ai didi

C# 类型参数作为通用声明

转载 作者:太空狗 更新时间:2023-10-29 22:04:58 29 4
gpt4 key购买 nike

在为泛型方法指定类型时尝试使用类型参数时出现错误。

Error: 'JsonFilter.JsonDataType' is a 'property' but is used like a 'type'

public class JsonFilter : ActionFilterAttribute
{
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
JavaScriptSerializer jss = new JavaScriptSerializer();
var result = jss.Deserialize<JsonDataType>(inputContent);//Error here
...

新代码

...
JavaScriptSerializer jss = new JavaScriptSerializer();
MethodInfo method = jss.GetType()
.GetMethod("Deserialize")
.MakeGenericMethod(new Type[] { JsonDataType });
var result = method.Invoke(jss, new object[] { inputContent });
filterContext.ActionParameters[Param] = result;
...

反射(reflection)可以挽回局面。感谢@Jason 的解释,当类型被指定为泛型方法的一部分时 (<Typename> ),然后它被编译成字节。而当作为属性时,它可以是任何类型,只能在运行时确定。

更新

针对这个具体问题,下面的代码更简洁。

var o = new DataContractJsonSerializer(JsonDataType).ReadObject(
filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;

最佳答案

错误

Error: 'JsonFilter.JsonDataType' is a 'property' but is used like a 'type'

准确地告诉你问题所在。

var result = jss.Deserialize<JsonDataType>(inputContent);

在这里,你试图通过 JsonDataType作为泛型方法的类型参数 JavaScriptSerializer.Deserialize<T>

但是在这里

public Type JsonDataType { get; set; }

你声明了JsonDataType作为 Type 类型的属性,但不是作为一种类型。要使用泛型方法,您需要传递一个类型参数(或者,在某些情况下,让编译器推断一个)。例如

var result = jss.Deserialize<string>(inputContent);

将是 string 的正确用法是一种类型。

现在,如果您绝对想使用 JsonDataType 表示的类型你可以使用反射。

MethodInfo generic = typeof(JavaScriptSerializer).GetMethod("Deserialize")
.GetGenericMethodDefinition();
MethodInfo closed = generic.MakeGenericMethod(new [] { JsonDataType });
closed.Invoke(jss, new object[] { inputContent });

关于C# 类型参数作为通用声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110586/

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