C# 获取泛型参数类型的名称
我有一个特殊的实用程序类,我正在做一些非常疯狂的事情,但我需要它做的一件事是获取最内部的通用参数类型名称 请允许我解释一下C# 获取泛型参数类型的名称,c#,generics,C#,Generics,我有一个特殊的实用程序类,我正在做一些非常疯狂的事情,但我需要它做的一件事是获取最内部的通用参数类型名称 请允许我解释一下 public class Magicutil<T> { public string GetNameOfInnerT() { //TODO } } 现在让我们假设在这种情况下T是等距的 我想还福 有什么想法吗?如果您确定T是泛型的,并且只有一个泛型参数,那么您可以直接使用下面代码的返回部分。否则,您需要检查type
public class Magicutil<T>
{
public string GetNameOfInnerT()
{
//TODO
}
}
现在让我们假设在这种情况下T是等距的
我想还福
有什么想法吗?如果您确定T是泛型的,并且只有一个泛型参数,那么您可以直接使用下面代码的返回部分。否则,您需要检查typeofT.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
}
我想你需要一个循环:
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。这与您的需求不完全匹配,但这一个为您提供了一个类型的C名称,例如Magicutil
隐马尔可夫模型。。。Foo是从哪里来的?用return Foo替换//TODO或更仔细地解释你的问题我正在做一些非常疯狂的事情-如果是疯狂的,你为什么要这么做?哦,对不起,伙计们。。。没有意识到它删掉了重要的一点@我的厨房坏了。。。抱歉,这个问题没有意义,否则lolIm不确定,但此方法将同时处理泛型t和非泛型t。。。现在测试一下:你的问题是你想在MagicUtils中找到K。。。如果你没有但没有t,你会期望什么行为?我正在测试t是否是通用的,如果不是,这个问题是如何得到t如果不是,我已经有了我的答案:Funky。。。我喜欢这个答案,但我们的内部编码标准意味着,这个特定的代码块将永远不会看到这种类型的T+1尽管:
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;
}
}