【发布时间】:2021-03-20 00:04:22
【问题描述】:
目前我正在 .NET Core 3.1 下编写 C# 代码以检查当前类型(我使用 Mono.Cecil,但 System.Reflection 可能更适合)是否为 Span 类型。找到有关如何检查类型是否为generic 的信息后,我为此类检查编写了一些虚拟代码:
unsafe
{
IntPtr unmanagedHandle = Marshal.AllocHGlobal(16);
Span<byte> unmanaged = new Span<byte>(unmanagedHandle.ToPointer(), 16);
if (unmanaged is object)
if ((unmanaged as object).GetType().GetGenericTypeDefinition() == typeof(Span<>))
Console.WriteLine("Span!");
Marshal.FreeHGlobal(unmanagedHandle);
}
尽管官方 MSDN 文档说 Span<> IS an object,但在编译时,我遇到了警告和错误:CS0184 警告 "unmanaged" is never of the "object" 类型,而 CS0039 告诉 "System.Span<byte>" cannot be converted to "object" via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion。至少,文档指出Span<> 不是通常的object。
是否有任何其他方法(只有一个依赖项Mono.Cecil)来确定某些object(或至少由IntPtr 引用的另一条基础数据)是否是Span 派生的?
【问题讨论】:
-
你可以试试
as的大小写吗?喜欢:if (unmanaged as Span != null) -
您永远不会遇到这样一种情况,即对未知类型的引用实际上是
Span<>,正如您所发现的那样。因此,简化代码的简单方法是回答false。 -
@Jonathan,使用“as”和
Span,以任何形式,都会带来相同的 CS0039 错误 -
@Damien_The_Unbeliever,除非您需要枚举您在代码中遇到的所有类型 - 对于任何涉及反射的任务(如程序集混淆或保护)