获取通用参数类型的名称

时间:2014-08-15 12:13:50

标签: c# generics

我有一个特殊的实用工具类我做了一些非常疯狂的事情,但我需要做的事情之一就是得到内部最通用的参数类型名称。

请允许我精心设计......

public class Magicutil<T>
{
     public string GetNameOfInnerT()
     {
         //TODO
     }
}

现在我们假设在这种情况下T是ISomething<Foo> 我想回归&#34; Foo&#34;。

任何想法?

3 个答案:

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