我在为泛型方法指定Type时尝试使用Type参数时出现错误。C#类型参数为通用声明
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;
...
反思节省了一天。感谢@Jason的解释是,当类型被指定为泛型方法的一部分时(< 类型名称>),然后将其编译为字节。而作为属性时,它可以是任何类型,只能在运行时确定。
UPDATE
对于这个特定的问题,下面的代码更简洁。
var o = new DataContractJsonSerializer(JsonDataType).ReadObject(
filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
我可能会完全关闭基地在这里,但它看起来像你想的通用反序列化方法与在运行时间定义的类型的工作......我不认为泛型以这种方式工作 - 它们很好,而且在设计时是“通用的”,但是它们被编译为类型特定的代码...... yuck。我缺乏理解表明。底线:我不认为你想要做什么是可能的。您不能将泛型与运行时指定类型一起使用。 –
Tao
2010-01-21 15:57:30
@陶:它可以使用反射来完成。在适当的环境下,这实际上是一种非常强大的技术。 – jason 2010-01-21 16:05:54