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

时间:2016-09-20 11:45:37

标签: c# .net-core

目前,我正在将.NET 4.5类库转换为.NET Core类库,引用.NETStandard v1.6

在我的部分代码中(严重依赖于反射),我需要确定对象是否为Closure类型,它位于System.Runtime.CompilerServices命名空间中。 .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 个答案:

答案 0 :(得分:1)

在.Net Core 1.0中,Closure exists in the System.Linq.Expressions assembly in the System.Linq.Expressions package,但它未在参考程序集中公开。这意味着它只是Core中的一个实现细节(例如可以在将来的版本中消失或移动)。这也意味着你无法在编译时引用它(就像在.Net Framework中那样),但你可以在运行时使用反射来检索它(不要忘记using System.Reflection; GetTypeInfo() }):

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

在.Net Framework中,Closure位于不同的程序集中(即System.Core),但Expression也是如此,因此此代码应适用于这两个程序集。