Csharp/C#教程:System.Type.FullName的意外值分享


System.Type.FullName的意外值

我最近需要为任意类型构建C#特定名称(必须始终包含global :: specifier)并且遇到以下问题:

// 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语言, Type.FullName返回相同的值,无论是C#,VB.NET,Oxygene还是其他任何东西。

对于多维和锯齿状数组,C#语法按照稍后编写的顺序列出索引,而reflection语法返回与数组的逻辑结构匹配的内容。 毕竟,(C#) string[,][,,][,,,]是一个string类型的值,它是一个4维数组(即string[,,,] ),它是一个三维的数组(即string[,,,][,,] )及其二维数组(即string[,,,][,,][,] )。

您可能希望在分析类型时检查Type类的属性,而不是依赖FullName返回的reflection语法名称。 可以从那里检索诸如维数或通用参数之类的信息 。

构造类型时,您还可以使用MakeArrayTypeMakeGenericType等方法在运行时创建复杂类型,而无需构造包含新类型成分的字符串。

Marc Gravell指出了这个答案的一些内容 – 谢谢!

注意:这并不能直接解决您的问题

这是逆转预期的行为吗?

但我觉得它增加了它。


您可以使用GenerateCodeFromExpression返回一个字符串,该字符串可用于生成代码以为您生成类型,例如使用此代码(通过hvd修改此SO答案 ):

 ///  /// Returns a readable name for this type. /// eg for type = typeof(IEnumerable<IComparable<int>>), /// type.FriendlyName() returns System.Collections.Generic.IEnumerable<System.IComparable<int>> /// type.Name returns IEnumerable`1 /// type.FullName() returns System.Collections.Generic.IEnumerable`1[[System.IComparable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] ///  public static string FriendlyName(this Type type) { string result; using ( var codeDomProvider = CodeDomProvider.CreateProvider("C#") ) { var typeReferenceExpression = new CodeTypeReferenceExpression(new CodeTypeReference(type)); using ( var writer = new StringWriter() ) { codeDomProvider.GenerateCodeFromExpression(typeReferenceExpression, writer, new CodeGeneratorOptions()); result = writer.GetStringBuilder().ToString(); } } return result; } 

通过让codeDomProvider处理字符串表示, 您可以确保生成的内容与您定义Type的方式相匹配。

FullName结果:

 // returns "System.String[,,,][,,][,]" typeof(string[,][, ,][, , ,]).FullName; // returns "System.String[,][,,][,,,]" typeof(string[, , ,][, ,][,]).FullName; // returns "System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" typeof(List).FullName; 

FriendlyName结果

上述就是C#学习教程:System.Type.FullName的意外值分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 // returns "string[,][,,][,,,]" typeof(string[,][, ,][, , ,]).FriendlyName(); // returns "string[,,,][,,][,]" typeof(string[, , ,][, ,][,]).FriendlyName(); // returns "System.Collections.Generic.List" typeof(List).FriendlyName(); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1269714.html

(0)
上一篇 2022年11月22日
下一篇 2022年11月22日

精彩推荐