在.NET Core中使用反射

30

为了进行跨平台开发,我正在尝试创建一个 .NET Core 共享库。我在 VS 2015 中使用了 Class Library (package) 项目模板。我的库需要使用一些反射机制,这些反射机制来自于完整的 .net 4 框架,但我不知道如何在 .NET Core 库中访问这些机制。具体而言:

  • Delegate 类型有一个返回 MethodInfo 对象的 Method 属性。
  • Type 类有一个 BaseType 属性、FilterName 属性、InvokeMember 方法和 FindMembers 方法,在 .NET Core 中我无法访问这些属性与方法。

我添加了 NuGet 软件包,声称其中包含我需要的反射部分:

"frameworks": {
  "net451": {
    "dependencies": {
      "System.Reflection": "4.1.0-beta-23516",
      "System.Reflection.Extensions": "4.0.1-beta-23516",
      "System.Reflection.Primitives": "4.0.1-beta-23516",
    }
  },
  "dotnet5.4": {
    "dependencies": {
      "Microsoft.CSharp": "4.0.1-beta-23516",
      "System.Collections": "4.0.11-beta-23516",
      "System.Linq": "4.0.1-beta-23516",
      "System.Reflection": "4.1.0-beta-23516",
      "System.Reflection.Extensions": "4.0.1-beta-23516",
      "System.Reflection.Primitives": "4.0.1-beta-23516",
      "System.Runtime": "4.0.21-beta-23516",
      "System.Threading": "4.0.11-beta-23516"
    }
  }
},
"dependencies": {
  "System.Reflection.TypeExtensions": "4.1.0-beta-23516"
}

我已经添加了 using System.Reflection,但是我仍然收到错误提示,指出这些属性和类型未定义。

我做错了什么?

如果相关的话,在这台计算机上运行 dnvm list 命令会显示:

Active Version           Runtime Architecture OperatingSystem Alias  
------ -------           ------- ------------ --------------- -----  
    1.0.0-rc1-update1 clr     x64          win                    
    1.0.0-rc1-update1 clr     x86          win                    
    1.0.0-rc1-update1 coreclr x64          win                    
*    1.0.0-rc1-update1 coreclr x86          win             default

以上正是我想要的......或者至少是我认为我想要的。 ;)


".NET Core仍在开发中,尚未完整。可能尚未将System.Reflection移植到.NET Core中。" - Saleem
2
至少对于BaseType,您可以使用type.GetTypeInfo().BaseType,这是自WinRT/UWP以来它被移动到的位置(大致上是.NET Core所基于的System.Runtime)。许多标准调用已在GetTypeInfo()和类似方法之后删除。 - Tseng
你在什么时候遇到错误?那些错误是什么? - Shaun Luttin
3个回答

25

简短回答

我做错了什么?

你正在试图访问在 .NET 4.5.1 中可用但在 5.4 中不可用的成员。

4.x                        Workaround in 5.x/Core

Delegate.Method.           Delegate.GetMethodInfo()
Type.BaseType.             Type.GetTypeInfo()
Type.FilterName            -
Type.InvokeMember          -
Type.FindMembers           -

从 Visual Studio 直接剪切。

如果我们将鼠标悬停在错误上,Visual Studio 会告诉我们这个信息。

ype.BaseType is not available...

.NET 可移植性报告

还值得看一下.NET 可移植性分析器。我们可以从Visual Studio Gallery中安装它。

运行它会告诉我们,例如,Type.BaseType不可用,并推荐一个解决方法。

.NET Portability Analyzer output


7

4
我正在使用 .net Core 1.0。请尝试以下的项目文件代码片段,看看是否适用于您。我还注意到您正在使用 beta API,如果可能,请避免使用 beta 版本。
{
    "version": "1.0.0-*",
    "compilationOptions": {
        "emitEntryPoint": true
    },

    "dependencies": {
        "NETStandard.Library": "1.0.0-rc2-23811",
        "System.Reflection.TypeExtensions": "4.0.0"
    },

    "frameworks": {
        "dnxcore50": { }
    }
}

NETStandard.Library 在 NuGet 上不可用,我无法使用它。你从哪里得到的?显然,它没有被发布在任何位置。此外,NETStandard.Library 到底是什么?我没有找到任何关于它的文章或文档。 - Brent Arias
在创建这个项目的几周前,我运行了“dnvm restore”命令。我更新了我的问题,以展示我的机器上的“dnvm list”结果。你是说这还不够好吗? - Brent Arias
1
请查看您的 project.json 文件。它正在引用 beta 组件,例如:"System.Reflection": "4.1.0-beta-23516"。请将版本更新为非 beta 版本后再次还原。 - Saleem

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