当前位置: 首页 > 编程语言 > C#

如何使用反射获取泛型类型的正确文本定义?分享

时间:2023-04-10 23:05:45 C#

如何使用反射获取泛型类型的正确文本定义?我正在研究代码生成,但对泛型有疑问。这是导致我出现问题的原因的“简化”版本。字典dictionary=newDictionary();stringtext=dictionary.GetType().FullName;使用上面的代码片段,文本的值如下:System.Collections.Generic.Dictionary`2[[System.String,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.DateTime,mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]](为了便于阅读而添加了换行符。)有没有办法在不解析上面的字符串的情况下以不同的格式获取类型名称(type)?我希望文本结果如下:System.Collections.Generic.Dictionary在.NetFramework中没有内置方法来获取此表示形式。那是因为没有办法把它弄好。有许多结构无法用C#风格的语法表达。例如,“foo”在IL中是一个有效的类型名称,但在C#中不可表示。但是,如果您正在寻找一个非常好的解决方案,可以非常快速地手动实现它。以下解决方案适用于大多数情况。它不会处理其他一些嵌套类型是非法C#名称的场景}if(!type.IsGenericType){返回类型.FullName;}varbuilder=newSystem.Text.StringBuilder();varname=type.Name;varindex=name.IndexOf("`");builder.AppendFormat("{0}.{1}",type.Namespace,name.Substring(0,index));builder.Append('');返回builder.ToString();正如@LukeH评论的那样,一个好的和干净的替代方法是使用System;使用System.CodeDom;使用System.Collections.Generic;使用Microsoft.CSharp;//...privatestringGetFriendlyTypeName(Typetype){using(varp=newCSharpCodeProvider()){varr=newCodeTypeReference(type);返回p.GetTypeOutput(r);今晚我尝试了一些扩展方法,我试图找到你问题的答案。结果如下:这是一个无保修代码。?内部静态类TypeHelper{privateconstchargenericSpecialChar='`';私有常量字符串genericSeparator=",";publicstaticstringGetCleanName(thisTypet){stringname=t.Name;如果(t.IsGenericType){name=name.Remove(name.IndexOf(genericSpecialChar));}返回名称;}publicstaticstringGetCodeDefinition(thisTypet){StringBuildersb=newStringBuilder();sb.AppendFormat("{0}.{1}",t.Namespace,t.GetCleanName());if(t.IsGenericType){varnames=fromgaint.GetGenericArguments()selectGetCodeDefinition(ga);sb.Append("");}返回sb.ToString();}}classProgram{staticvoidMain(string[]args){object[]testCases={newDictionary(),newList(),newList>(),0};输入t=testCases[0].GetType();字符串文本=t.GetCodeDefinition();控制台.WriteLine(文本);}}字符串文本=dictionary.ToString();提供几乎所有要求的:System.Collections.Generic.Dictionary`2[System.String,System.DateTime]我不认为.NET有内部设置的东西可以做到这一点,所以你必须必须自己做我认为反射类提供了足够的信息来重构这种形式的类型名称。我相信您可以将System.String、mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089传递到Type.Parse()中。我认为这是一个完全限定的类型名称。以上就是C#学习教程:如何使用反射获取泛型类型的正确文本定义?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: