在反射FullName中,“+”代表嵌套类型,而在C#成员后面加“*”表示通配符。

13

我目前正在处理C#中的反射。在:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetTypes()

我发现了以下内容:[System.Numerics.Matrix4x4],[System.Numerics.Matrix4x4+CanonicalBasis],[System.Numerics.Matrix4x4+VectorBasis] (这些是从“System.Numerics.Vectors.dll”反射出的类型) 我知道Matrix4x4是一个结构体,但我找不到有关CanonicalBasis和VectorBasis的任何信息,也不知道在这种情况下“+”代表什么意思。 我进行了进一步的研究,另一个奇怪的事情是:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").FullName
"System.Numerics.Matrix4x4+VectorBasis"

但是:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").Name
"VectorBasis"
此外,当我浏览Matrix4x4+VectorBasis的成员时,有这样一个成员:

[System.Numerics.Vector3* Element0] 

它是类似于C++中的原始指针吗?还是其他东西?

P.S. 我是在C#交互式环境下进行的,但我不认为它对结果产生了任何影响。

2个回答

13

+符号表示类名之间的关系,它表明+后面的部分是前面类型的嵌套类型。例如:Dictionary<string, string>+KeyCollection,其中KeyCollectionDictionary<TKey, TValue>的内部类。

*代表指针,因为所提到的字段处于不安全模式下:

public unsafe Vector3* Element0;

然而,如果我执行以下操作: Assembly.LoadFile(@“C:\ Program Files \ dotnet \ shared \ Microsoft.NETCore.App \ 2.0.7 \ System.Numerics.Vectors.dll”)。GetType(“System.Numerics.Matrix4x4”)。GetNestedTypes() 我会得到: Type [0] {} - Kacper
@Kacper GetNestedTypes只会显示公共的嵌套类型。请参考我的答案。 - adjan
2
@Kacper 使用 GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic) 来获取 所有 嵌套类型。 - Lucas Trzesniewski
这个命名模式(嵌套类型使用 +)是在规范中定义的,还是只是当前编译器版本的惯例? - Bradley Uffner

4
在字符串中 System.Numerics.Matrix4x4+VectorBasis+ 表示 VectorBasisMatrix4x4 的嵌套类型。在这种情况下,VectorBasis 是一个嵌套在 class 中的 struct。请注意,不管你处理什么类型的嵌套类型,+ 都是相同的符号。
class A
{
    public class B {}
}

struct A
{
    public struct B {}
}

class A
{
    public enum B {}  
}

这些示例中的所有嵌套类型都具有相同的FullName,即A+B

在您的情况下,VectorBasisCanonicalBasisprivate成员,这就是为什么您无法通过Type.GetNestedTypes()看到它们,因为该方法只显示public成员。


System.Numerics.Vector3*后面的*表示它是指针类型。该字符串来自于FieldInfo.FieldType属性的Type实例。


您可以在MSDN文档的相应页面上查找Type类的此及其他可能的字符串表示形式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接