获取泛型类的名称

时间:2014-02-26 15:05:16

标签: c# generics reflection

我有一个这样的课程:

public class Item<T>
{
   // some properties using T
} 

一切正常,但是,我的MVC项目中有一些视图,我需要读取类的名称。当我有一个没有Generics的类它工作文件时,我只使用typeof(Model).Name并使用它。问题是,当我有一个通用T的类,.Name类型的Type属性时,返回如下内容:

 Item`1

我想在不同的字符串中读取这两个名称而无需解决方法来删除`char 。我想这样:

对于这样的类型:

Item<Product>

我想得到这个:

string baseClass = "Item";
string genericClass = "Product";

我该怎么办?

1 个答案:

答案 0 :(得分:0)

此函数返回表示给定类型的C#声明的字符串。

它适用于大多数事情,但可能有一个或两个边缘情况,它无法正常工作。我写了一段时间,但现在看着它,我认为它不支持nullables。

/// Returns a string that can be used as a C# type definition.
string GetTypeDefinition(Type t)
{
    if (t == typeof(void)) return "void";

    StringBuilder sb = new StringBuilder();

    string name = t.IsGenericType ? t.FullName.Substring(0, t.FullName.IndexOf("`")) : t.FullName;

    sb.Append(name);

    if (t.IsGenericType)
    {
        sb.Append("<");
        bool first = true;
        foreach(Type genericType in t.GenericTypeArguments)
        {
            if (!first) 
            {
                sb.Append(", ");
            }
            first = false;
            sb.Append(GetTypeDefinition(genericType));
        }
        sb.Append(">");
    }

    if (t.IsArray)
    {
        sb.Append("[]");
    }

    return sb.ToString();
}