0

当我调用该方法时,以下代码失败。没有例外; 一切都崩溃了。此代码位于 Windows Phone 7 可移植类库中,知道发生了什么吗?

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);
}
4

2 回答 2

1

在 Silverlight for Windows Phone 中存在 MakeGenericMethod,但不受支持。

在“平台说明”下查看:http: //msdn.microsoft.com/en-us/library/system.reflection.methodinfo.makegenericmethod (v=vs.95).aspx

于 2012-11-03T17:41:02.253 回答
1

简短的回答:

你根本不需要在这里反思。您可以通过简单地调用来替换您的Deserialize(string, Type)方法(并摆脱) 。Cast<T>JsonConvert.DeserializeObject(string, Type)

更长的答案:

您的Cast<T>方法不必要地使事情复杂化:

  • 它有一个类型参数T并返回一个T对象/值,但调用方法 ( Deserialize) 无论如何都不关心这个;它返回一个 "untyped" object,所以Cast也可以返回object

  • 必须将Type对象转换为相应的类型参数T意味着您需要进行一些类型反射。但是,如果Cast<T>不是通用的——正如上面所指出的,它不一定是——你就不需要所有的反射。

  • 事实证明,Json.NET 也不需要类型参数TJsonConvert.DeserializeObject具有接受Type对象的非通用“重载”。

因此,摆脱您的Cast<T>方法和反射绕道而简单地使用非泛型JsonConvert.DeserializeObject(string, Type)重载。

PS:关于您最初的问题,根据描述 CLI(由 .NET、.NET Compact、Silverlight 和 WP7 实现)的 ECMA-335 标准,Reflection 不是内核库的一部分,而是一个单独但可选库。如果它在特定平台上不存在(例如在 WP7、AFAIK 上),Type则对象本质上将被视为不透明对象,您无法从中派生其他Type实例。

于 2012-11-03T23:14:59.700 回答