我在尝试为一个泛型方法指定类型参数时遇到了错误。
错误:'JsonFilter.JsonDataType' 是一个 '属性',但是像 '类型' 一样使用
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;
...
反射拯救了这一天。感谢@Jason的解释,当类型作为泛型方法的一部分指定(<类型名>)时,它会被编译成字节码。而当作为属性时,它可以是任何类型,在运行时确定。
更新
针对这个特定问题,以下代码更为简洁。
var o = new DataContractJsonSerializer(JsonDataType).ReadObject(
filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;