便携式类库和反射

时间:2012-12-27 21:04:24

标签: c# reflection portable-class-library

我正在为桌面,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编辑器中是红色的。我不知道为什么会发生这种情况以及如何访问这些属性。

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

2 个答案:

答案 0 :(得分:18)

我们在.NET for Windows Store应用程序的反射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()并不是&#39认识到了。

所以,你的代码应该是这样的:

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

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

答案 1 :(得分:0)

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

来自类型的元数据

  

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

对开放式通用类型的反思

  

在Windows Phone 7上,封闭的泛型类型支持反射;   但是,开放泛型不支持大多数反射操作   类型。在开放泛型类型上,只有以下反射操作   Windows Phone 7支持:检索打开的泛型类型或   调用GetTypeGetMethods方法的方法。创建通用   打开泛型类型或方法的类型或方法,通过调用   MakeGenericTypeMakeGenericMethod方法。对于所有其他反思   对开放泛型类型的操作,NotSupportedException例外   抛出。

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