C# Windows Phone中的反射
当我调用该方法时,以下代码失败。没有例外;一切都崩溃了。这段代码在WindowsPhone7可移植类库中,知道发生了什么吗C# Windows Phone中的反射,c#,windows-phone,C#,Windows Phone,当我调用该方法时,以下代码失败。没有例外;一切都崩溃了。这段代码在WindowsPhone7可移植类库中,知道发生了什么吗 public static object Deserialize(string input, Type type) { var castMethod = typeof(ModelBase).GetMethod("Cast").MakeGenericMethod(type); object castedObject = castMethod.Invoke(nu
public static object Deserialize(string input, Type type)
{
var castMethod = typeof(ModelBase).GetMethod("Cast").MakeGenericMethod(type);
object castedObject = castMethod.Invoke(null, new object[] { input });
return castedObject;
}
public static T Cast<T>(string input)
{
return JsonConvert.DeserializeObject<T>(input);
}
公共静态对象反序列化(字符串输入,类型)
{
var castMethod=typeof(ModelBase).GetMethod(“Cast”).MakeGenericMethod(type);
object castedObject=castMethod.Invoke(null,新对象[]{input});
返回castedObject;
}
公共静态T转换(字符串输入)
{
返回JsonConvert.DeserializeObject(输入);
}
存在MakeGenericMethod,但Silverlight for Windows Phone不支持该方法
在“平台注释”下检查此处:简短回答: 在这里你根本不需要思考。只需调用即可替换
反序列化(字符串、类型)
方法(并摆脱强制转换
)
更长的回答:
您的Cast
方法不必要地使事情复杂化:
- 它有一个类型参数
,并返回一个T
对象/值,但调用方法(T
)并不关心这一点;它返回一个“非类型化”的反序列化
,因此对象
也可以返回Cast
对象
- 必须将
对象转换为Type
的相应类型参数,这意味着您需要进行一些类型反射。然而,如果T
不是泛型的,正如上面指出的,它不一定是泛型的,那么您就不需要所有的反射Cast
- 事实证明,Json.NET也不需要类型参数
t
具有接受JsonConvert.DeserializeObject
类型的非泛型“重载”
Cast
方法和反射迂回,只需使用非泛型重载
p.S.:关于您的原始问题,根据描述CLI(由.NET、.NET Compact、Silverlight和WP7实现)的ECMA-335标准,反射不是内核库的一部分,而是一个单独但可选的库。如果在特定平台(如WP7、AFAIK)上不存在,
Type
对象本质上被视为不透明对象,您无法从中派生出其他Type
实例。是的,我在发布此问题后大约10分钟就发现了这一点:p感谢您的详细分析。此外,实际上需要强制转换,因为一旦我拿回对象,我会对其进行处理,它是一个“对象”,但仍然是类型化的。太晦涩了,无法解释,但Json.NET中的反序列化对象重载正是我所需要的。