C# 可移植类库与反射

C# 可移植类库与反射,c#,reflection,portable-class-library,C#,Reflection,Portable Class Library,我正在为桌面、Windows8商店和WindowsPhone同时构建新的应用程序。所以我创建了可移植类库,以便在所有平台上都具有通用功能。我的问题是,当我试图在PCL中重用代码时,我无法访问库中的某些方法和属性。根据MSDN,这些方法是受支持的,但我现在知道为什么我不能访问它们 var property = memberExpression.Member as PropertyInfo; if (property == null) {

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

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

        var getMethod = property.GetGetMethod(true);
        if (getMethod.IsStatic)
        {}
下面是无法编译的代码片段。在VisualStudio编辑器中,GetMethod和IsStatic以红色显示。我不知道为什么会发生这种情况,以及如何访问这些属性


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

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

来自类型的元数据

评估从
系统返回的元数据时。键入
方法和
属性时,相等运算符可能返回不同的结果
不同的平台。在.NET Compact Framework中,每个
调用
Type.GetMethod
方法返回
System.Reflection.MethodInfo
,因此返回值永远不会作为 平等。但是,在.NET Framework 4中,使用 相同参数返回MethodInfo的相同实例。你必须 使用时,请检查并可能修改代码 以下系统.反射类型:
MethodInfo
FieldInfo
属性信息
事件信息
成员信息
方法库
构造函数信息
,以及
参数信息

对开放泛型类型的反思

在Windows Phone 7上,关闭的泛型类型支持反射; 但是,大多数反射操作在open generic上不受支持 类型。在打开泛型类型上,仅执行以下反射操作 Windows Phone 7支持:检索打开的泛型类型或 方法调用
GetType
GetMethods
方法。创建泛型 通过调用
MakeGenericType
MakeGenericMethod
方法。所有其他的思考 对打开的泛型类型执行操作时,会出现
NotSupportedException
异常 扔


来源:

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

对于可移植类库,如果您只针对支持新反射API的平台,那么您将只获得新API。如果您添加了一个不支持新API的平台,那么您将获得这些API

PropertyInfo.GetMethod()
不是新API的一部分,因此应该改用
PropertyInfo.GetMethod
MethodInfo.IsStatic
是新API的一部分,您在Visual Studio中看到红色曲线的原因是因为它不知道getMethod是什么类型,因为您使用了
var
并且getMethod()未被识别

因此,您的代码应该如下所示:

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

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

使用Type.GetMethod调试器的意思是什么?GetMethod和GetMethod是两个不同的东西,那么为什么我要使用GetMethod呢?编译器说它无法解析符号getMethod。这个问题是,如果目标平台是Windows Phone 8,则.NET 4.5中针对PCL或Windows应用商店的应用程序的反射API已发生一些更改。下面的博客文章提供了一个很好的变化介绍:
http://blogs.msdn.com/b/dotnet/archive/2012/08/28/evolving-the-reflection-api.aspx
。值得注意的是:GetMethod和同级不再可用。改为使用
DeclaredMethod
属性(可在
TypeInfo
实例上找到,您可以使用
.GetTypeInfo()
从类型实例中获得该属性)。向下滚动到
为新的反射API编写代码–Windows应用商店和可移植类库
,以查找所需信息(但我建议你阅读整篇博文)。同样的问题,当GetMethod与GetMethod不同时,为什么要使用GetMethod?作为旁白,是否有支持反射的计划。在任何时候在PCL中发射?完整准确的答案!!!非常感谢你让我的生活变得更加轻松now@MortenMertner针对.NET 4.5和.NET 4.5的可移植类库已经支持Reflection.EmitWindowsPhone8。