我最近需要为任意类型构建C#特定名称(必须始终包含global::说明符),并且遇到以下问题:
// 1 - value: System.String[,,,][,,][,]
string unexpectedFullName = typeof( string[,][,,][,,,] ).FullName;
// 2 - value: System.String[,][,,][,,,]
string expectedFullName = Type.GetType( "System.String[,][,,][,,,]" ).FullName;
我期望两种情况下的返回值都相同。但是,由于某种原因,该值的与数组相关的部分似乎被反转了(情况1)。这是逆转的预期行为吗?
最佳答案
虽然 Type.FullName
返回的值和C#类型标识符有时碰巧是相同的,但这不能保证。请记住,无论从哪个CLI语言(无论是C#,VB.NET,Oxygene或其他任何语言)调用,Type.FullName
都会返回相同的值。
对于多维数组和参差不齐的数组,C#语法按以后写入的顺序列出索引,而反射语法返回的值与数组的逻辑结构相匹配。 (C#)string[,][,,][,,,]
毕竟是string
类型的值,其值为4维数组(即string[,,,]
),3维数组(即string[,,,][,,]
)和2维数组(即string[,,,][,,][,]
)。
您可能不希望依赖于FullName
返回的反射语法名称,而是在分析类型时要检查Type
类的属性。可以从那里检索诸如number of dimensions或generic arguments之类的信息。
构造类型时,还可以使用 MakeArrayType
或 MakeGenericType
等方法在运行时创建复杂类型,而无需构造包含新类型成分的字符串。
Marc Gravell指出了此答案的某些内容-谢谢!
关于c# - System.Type.FullName的意外值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28942537/