.NET中的System.Runtime.CompilerServices标准库

问题描述:

目前,我正在将.NET 4.5类库转换为.NET Core类库,该过程将引用.NETStandard v1.6.NET中的System.Runtime.CompilerServices标准库

在我的部分代码中(主要依赖于反射),我需要确定一个对象是否位于System.Runtime.CompilerServices命名空间中的Closure类型。该名称空间和类型在.NETStandard v1.6中不可用。

  • 这种类型是移动还是不能访问?
  • 由于我的代码依赖于它,如果在.NETStandard中不可用,有什么替代方法?

特定代码依靠Closure确定参数类型一个委托的,跳过编译器生成Closure的。

Delegate toWrap; 
MethodInfo toWrapInfo = toWrap.GetMethodInfo(); 
var toWrapArguments = toWrapInfo.GetParameters() 
    // Closure argument isn't an actual argument, but added by the compiler. 
    .SkipWhile(p => p.ParameterType == typeof(Closure)) 
    .Select(p => p.ParameterType); 
+1

您是否尝试过使用旧的.net框架版本打印出类型,您知道它是'Closure'或类似的东西?获得该类型后,您可能很有可能在Visual Studio的对象目录中找到相应的类(以某种方式连接到您的类型)。 –

+0

@ChrisTophski我在上面。一旦我的迁移代码编译完成后,我将运行我的测试并查看发生了什么变化。如果没有其他人回答这个问题,我会的。 ; p –

+0

使用http://packagesearch.azurewebsites.net –

在.net核心1.0,Closure exists in the System.Linq.Expressions assembly in the System.Linq.Expressions package,但它没有暴露在参考大会。这意味着它只是Core中的一个实现细节(并且可能会在未来的版本中消失或移动)。这也意味着你不能在编译时引用它(就像你在.Net框架所做的那样),但你可以在系统运行时反射找回它(不要忘记using System.Reflection;GetTypeInfo()):

Type closureType = typeof(Expression).GetTypeInfo().Assembly 
    .GetType("System.Runtime.CompilerServices.Closure"); 

在。网络框架,Closure是在不同的程序集(即,System.Core),但也是Expression,所以这个代码应该在两个工作。

+0

在这种情况下,为了列出的代码的目的,我认为我只是简单地检查类型的FullName,因为通过反射检索类型依赖于完全相同的依赖关系。无论如何,这回答了这个问题。 –