gpt4 book ai didi

c# - .NET 标准库中的 System.Runtime.CompilerServices

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:21 25 4
gpt4 key购买 nike

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

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

  • 此类型是否已移动,或者是否不再可用?
  • 由于我的代码依赖它,如果它在 .NETStandard 中不可用,有什么替代方案?

依赖于Closure的具体代码决定了委托(delegate)的参数类型,跳过了编译器生成的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 );

最佳答案

在 .Net Core 1.0 中,Closure exists in the System.Linq.Expressions assembly in the System.Linq.Expressions package ,但它没有在引用程序集中公开。这意味着它只是 Core 中的一个实现细节(例如,可能会在未来的版本中消失或移动)。这也意味着您不能在编译时引用它(就像您在 .Net Framework 中所做的那样),但您可以在运行时使用反射检索它(不要忘记 using System.Reflection; for 获取类型信息()):

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

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

关于c# - .NET 标准库中的 System.Runtime.CompilerServices,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39593209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com