C# 用于封闭泛型的更简洁的GetType().ToString()
我不敢相信以前没有人问过这个问题,但由于我无法在stackoverflow的草堆中找到这个特殊的“针”,我正在问它 我希望为封闭泛型类型提供一个更简洁的GetType().ToString()实现。我的意思是,我希望ToString()调用以我在开发环境中键入的格式返回字符串 封闭泛型上的默认GetType().ToString()将放置'n,其中n是类型数,并使用[]而不是's 无论如何。。。遵守守则 鉴于以下类别:C# 用于封闭泛型的更简洁的GetType().ToString(),c#,C#,我不敢相信以前没有人问过这个问题,但由于我无法在stackoverflow的草堆中找到这个特殊的“针”,我正在问它 我希望为封闭泛型类型提供一个更简洁的GetType().ToString()实现。我的意思是,我希望ToString()调用以我在开发环境中键入的格式返回字符串 封闭泛型上的默认GetType().ToString()将放置'n,其中n是类型数,并使用[]而不是's 无论如何。。。遵守守则 鉴于以下类别: A a = new A(); C<A> c = new C<
A a = new A();
C<A> c = new C<A>();
D<A, B> d = new D<A, B>();
E<B, C<A>, D<A, B>> e = new E<B, C<A>, D<A, B>>();
我已经编写了一些基本的老式(linq之前)代码来生成:
AAA.Events.A
AAA.Events.C<AAA.Events.A>
AAA.Events.D<AAA.Events.A,AAA.Events.B>
AAA.Events.E<AAA.Events.B,AAA.Events.C<AAA.Events.A>,AAA.Events.D<AAA.Events.A,AAA.Events.B>>
AAA.Events.A
AAA.Events.C
AAA.Events.D
AAA.Events.E
但我真的希望它能回来:
A
C<A>
D<A,B>
E<B,C<A>,D<A,B>>
A
C
D
E
以下是我为证明我的意图而编写的劣质代码:
public static string NeaterString(this Type t)
{
string neater = t.ToString();
if (neater.Contains('`'))
{
while (neater.Contains('`'))
{
neater = neater.Remove(neater.IndexOf('`'), 2);
}
return neater.Replace('[', '<').Replace(']', '>');
}
else return neater;
}
公共静态字符串NeaterString(此类型为t)
{
字符串整洁=t.ToString();
if(neater.Contains('`'))
{
while(neater.Contains('`'))
{
neater=neater.Remove(neater.IndexOf('`'),2);
}
返回整洁。替换(“[”,“);
}
否则返回整洁;
}
我会尽量避免字符串解析。我的例程如下所示:
public static string GetFriendlyName(Type type)
{
if (type.IsGenericType)
return string.Format("{0}<{1}>", type.Name.Split('`')[0], string.Join(", ", type.GetGenericArguments().Select(x => GetFriendlyName(x))));
else
return type.Name;
}
公共静态字符串GetFriendlyName(类型)
{
if(type.IsGenericType)
返回string.Format(“{0}”,type.Name.Split(“`')[0],string.Join(“,”,type.GetGenericArguments().Select(x=>GetFriendlyName(x));
其他的
返回类型.名称;
}
更多的是散弹枪方法:
public static class TypeExtensions
{
public static string PrettyPrint(this Type type)
{
var str = type.ToString();
for (int i = 1; i < 6; i++)
{
str = str.Replace($"`{i}[", "<");
}
str = str.Replace("]", ">");
var knownNamespaces = new[]
{
"System.",
"My.Models.",
"Domain."
};
foreach (var knownNamespace in knownNamespaces)
{
str = str.Replace(knownNamespace, string.Empty);
}
return str;
}
}
公共静态类类型扩展
{
公共静态字符串预打印(此类型)
{
var str=type.ToString();
对于(int i=1;i<6;i++)
{
str=str.Replace($“`i}[”,”);
var knownNamespaces=new[]
{
“系统。”,
“我的.模特儿。”,
“域名。”
};
foreach(knownNamespaces中的var knownNamespace)
{
str=str.Replace(knownNamespace,string.Empty);
}
返回str;
}
}
如果有超复杂的泛型将超过'5[的话,可以增加对
i
的限制,我正试图这样做,我还需要能够解析这些字符串,将它们转换回类型变量
。它可以将任何类型转换为与C#语法完全相同的字符串,并且可以将这些字符串转换回类型变量。完全支持泛型,包括未绑定泛型。希望有帮助:)有人问过。我注意到您的测试用例中没有包含嵌套泛型类型。我还有些担心您的方法与数组有关。我的代码更像业余VBA黑客,而不是真正的代码,我向你保证我无意使用它。我写它是为了表达这个问题,并寻找Linq-I-fied解决方案。出于兴趣,如果不是E,嵌套泛型类型是什么。
CLASSE a{public CLASSE B{}
--的结果是什么(新的A.B()).GetType().ToString()
?将相同类型传递给NeaterString
的结果是什么?可以通过将方法组直接传递给Select
。即:。Select(GetFriendlyName)
,避免分配lambda。
public static class TypeExtensions
{
public static string PrettyPrint(this Type type)
{
var str = type.ToString();
for (int i = 1; i < 6; i++)
{
str = str.Replace($"`{i}[", "<");
}
str = str.Replace("]", ">");
var knownNamespaces = new[]
{
"System.",
"My.Models.",
"Domain."
};
foreach (var knownNamespace in knownNamespaces)
{
str = str.Replace(knownNamespace, string.Empty);
}
return str;
}
}