便携式类库和反射

11

我正在同时为桌面、Windows 8商店和Windows手机构建新的应用程序,因此我创建了可移植类库以在所有平台上具有通用功能。我的问题是,在PCL内尝试重用我的代码时,我无法访问库中的某些方法和属性。根据MSDN,这些方法得到支持,但我不知道为什么无法访问它们。

        var property = memberExpression.Member as PropertyInfo;
        if (property == null)
        {
        }

        var getMethod = property.GetGetMethod(true);
        if (getMethod.IsStatic)
        {}

这是无法编译的代码片段。在Visual Studio编辑器中,GetGetMethod和IsStatic显示为红色。我不知道为什么会这样,也不知道如何访问这些属性。

如果有人曾经做过类似的事情,请帮助我使这段代码编译。


使用 Type.GetMethod 方法 http://msdn.microsoft.com/zh-cn/library/system.type.getmethod.aspx - Matija Grcic
调试器在说什么? - Victor
GetMethod和GetGetMethod是两个不同的东西,那我为什么要使用GetMethod呢? 编译器说它无法解析符号GetGetMethod。 这个问题出现在目标平台为Windows Phone 8的情况下。 - Rati_Ge
2
.NET 4.5 中的反射 API 针对 PCL 或 Windows Store 应用程序进行了一些更改。以下博客文章提供了有关这些更改的详细说明:http://blogs.msdn.com/b/dotnet/archive/2012/08/28/evolving-the-reflection-api.aspx。值得注意的是:GetMethod 和其兄弟方法不再可用。请改用 DeclaredMethod(s) 属性(在 TypeInfo 实例上可用,您可以使用 .GetTypeInfo() 从类型实例中获取它)。 - Morten Mertner
请向下滚动至“为新的反射 API(Windows Store 和便携式类库)编写代码”以获取所需信息(但我建议阅读全文)。 - Morten Mertner
显示剩余2条评论
2个回答

18

我们在.NET框架的反射API中进行了一些重构,用于Windows Store应用程序。请参阅博客文章Evolving the Reflection API以获取详细信息。除其他外,API更改为我们未来的更好可移植性做好了准备。新API可用于Windows Store应用程序、.NET 4.5和Windows Phone 8。出于兼容性考虑,在.NET 4.5和Windows Phone 8上仍然可以使用旧的API。

对于可移植类库(Portable Class Libraries),如果你只针对支持新反射API的平台,则只会得到新API。如果添加不支持新API的平台,则会得到旧API。

PropertyInfo.GetGetMethod()不是新API的一部分,所以应该使用PropertyInfo.GetMethod代替。MethodInfo.IsStatic是新API的一部分,你在Visual Studio中看到红色波浪线的原因是它不知道getMethod的类型,因为你使用了var并且GetGetMethod()无法识别。

因此,你的代码应该像这样:

    var property = memberExpression.Member as PropertyInfo;
    if (property == null)
    {
    }

    var getMethod = property.GetMethod;
    if (getMethod != null && getMethod.IsStatic)
    {}

1
顺便问一下,有计划在任何时候支持PCL中的Reflection.Emit吗? - Morten Mertner
完整准确的答案!!!非常感谢,现在我的生活变得更加容易了。 - Rati_Ge
1
@MortenMertner Reflection.Emit已经支持面向.NET 4.5和Windows Phone 8的可移植类库。 - Daniel Plaisted

0

关于我的评论,提供一些信息使用Type.GetMethod

Type的元数据

在评估从System.Type方法和属性返回的元数据时,等号运算符可能会在不同平台上返回不同的结果。在.NET Compact Framework中,每次对Type.GetMethod方法的连续调用都会返回System.Reflection.MethodInfo的新实例,因此返回值永远不会被评估为相等。然而,在.NET Framework 4中,使用相同的参数调用GetMethod将返回MethodInfo的相同实例。当您使用以下System.Reflection类型时,必须审查并可能修改您的代码:MethodInfoFieldInfoPropertyInfoEventInfoMemberInfoMethodBaseConstructorInfoParameterInfo

开放式泛型类型的反射

在Windows Phone 7上,封闭泛型类型支持反射;然而,大多数反射操作不支持开放泛型类型。对于Windows Phone 7,只支持以下反射操作:通过调用GetTypeGetMethods方法检索开放泛型类型或方法。通过调用MakeGenericTypeMakeGenericMethod方法从开放泛型类型或方法创建泛型类型或方法。对于开放泛型类型的所有其他反射操作,将抛出NotSupportedException异常。
来源:http://msdn.microsoft.com/en-us/library/gg597392.aspx

同样的问题,为什么要使用 GetMethod,而不是 GetGetMethod,它们有什么不同? - Rati_Ge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接