目前,我正在将.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 );
答案 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
也是如此,因此此代码应适用于这两个程序集。