我有一个特殊的实用工具类我做了一些非常疯狂的事情,但我需要做的事情之一就是得到内部最通用的参数类型名称。
请允许我精心设计......
public class Magicutil<T>
{
public string GetNameOfInnerT()
{
//TODO
}
}
现在我们假设在这种情况下T是ISomething<Foo>
我想回归&#34; Foo&#34;。
任何想法?
答案 0 :(得分:1)
如果您确定T
是通用的并且只有一个通用参数,则可以直接使用以下代码的return
部分。否则,您需要检查typeof(T).IsGenericType
是否可以计算通用参数。
public string GetNameOfInnerT()
{
Type type = typeof(T);
if (type.IsGenericType) {
// TODO: what if more than one generic arguments???
return type.GetGenericArguments()[0].Name;
}
// TODO: return null, empty string or throw exception
}
答案 1 :(得分:1)
我认为你需要一个循环:
public class Magicutil<T>
{
public string GetNameOfInnerT()
{
Type t = typeof(T);
if (t.IsGenericType)
{
Type[] tArr;;
while ((tArr = t.GetGenericArguments()).Length > 0)
t = tArr[0];
}
return t.Name;
}
}
现在这也处理了一些奇怪的事情Magicutil<ISomething<ISomething<Foo>>>
。
答案 2 :(得分:0)
这与您的要求不完全匹配,但是这个为您提供了类型的C#名称,例如Magicutil<ISomething<ISomething<Foo>>>
public static string GetClassName(Type cls)
{
if (cls.IsGenericType)
{
var param = string.Join(",", cls.GetGenericArguments().Select(v => GetClassName(v)).ToArray());
return cls.Name.Split('`')[0] + "<" + param + ">";
}
else
{
return cls.Name;
}
}