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;
        }
    }