11

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

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

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

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

所以如果有人做过类似的事情,请帮我编译这段代码。

4

2 回答 2

18

我们在用于 Windows 应用商店应用的 .NET 的反射 API 中进行了一些重构。有关详细信息,请参阅博客文章Evolving the Reflection API。除其他外,API 更改为我们在未来提供了更好的可移植性。新的 API 在 Windows 应用商店应用程序、.NET 4.5 和 Windows Phone 8 中可用。为了兼容性,旧 API 当然仍然在 .NET 4.5 和 Windows Phone 8 上可用。

对于可移植类库,如果您针对支持新反射 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)
    {}
于 2012-12-28T01:05:21.470 回答
0

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

来自类型的元数据

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

对开放泛型类型的反思

在 Windows Phone 7 上,封闭的泛型类型支持反射;但是,开放的泛型类型不支持大多数反射操作。对于开放的泛型类型,Windows Phone 7 仅支持以下反射操作: 通过调用GetTypeor方法检索开放的泛型类型或GetMethods方法。MakeGenericType通过调用or方法从开放的泛型类型或方法创建泛型类型或 MakeGenericMethod方法。对于开放泛型类型的所有其他反射操作,将NotSupportedException引发异常。

来源:http: //msdn.microsoft.com/en-us/library/gg597392.aspx

于 2012-12-27T21:12:56.893 回答