And*_*hin 9 .net c# reflection
我需要在代码中以声明的形式获取泛型类型的名称.
例如:对于List <Int32>,我想获取字符串"List <Int32>".在这种情况下,Standart属性Type.Name返回"List`1".
编辑:示例已修复
Car*_*Dev 14
使用内置函数和Linq可以编写
static string PrettyTypeName(Type t)
{
if (t.IsArray)
{
return PrettyTypeName(t.GetElementType()) + "[]";
}
if (t.IsGenericType)
{
return string.Format(
"{0}<{1}>",
t.Name.Substring(0, t.Name.LastIndexOf("`", StringComparison.InvariantCulture)),
string.Join(", ", t.GetGenericArguments().Select(PrettyTypeName)));
}
return t.Name;
}
Run Code Online (Sandbox Code Playgroud)
注意:在较旧版本的C#中,编译器需要显式string.Join:
string.Join(", ", t.GetGenericArguments().Select(PrettyTypeName).ToArray()));
Run Code Online (Sandbox Code Playgroud)
Eri*_*ich 12
好吧,我做了很多研究,发现typeof(List)有"GetGenericArguments",可以获得子名称.所以我会这样做(对于1个泛型类型,如果它是多个,它将采取循环或其他东西.如果请求,我可以发布一个函数.
这是一个使用多个泛型参数,处理'嵌套'泛型类型的函数.再次编辑以使用Aggregate函数:
static string GetFullName(Type t)
{
if (!t.IsGenericType)
return t.Name;
StringBuilder sb=new StringBuilder();
sb.Append(t.Name.Substring(0, t.Name.LastIndexOf("`")));
sb.Append(t.GetGenericArguments().Aggregate("<",
delegate(string aggregate,Type type)
{
return aggregate + (aggregate == "<" ? "" : ",") + GetFullName(type);
}
));
sb.Append(">");
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)