C# Windows Phone中的反射

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

当我调用该方法时,以下代码失败。没有例外;一切都崩溃了。这段代码在WindowsPhone7可移植类库中,知道发生了什么吗

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中的反序列化对象重载正是我所需要的。