【问题标题】:Get name of generic class [duplicate]获取泛型类的名称[重复]
【发布时间】:2014-03-29 12:18:19
【问题描述】:

我有这样的课:

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

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

 Item`1

我想在不同的字符串中读取这两个名称,而无需解决删除`字符的问题。我想要这样:

对于这样的类型:

Item<Product>

我想得到这个:

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

我该怎么做?

【问题讨论】:

  • 不,不重复,请READ我的问题! READ READ READ \o/ 我希望它没有字符串的工作,如果没有办法,只是不 awnser :)
  • 如果有多个通用参数,您希望genericClass 看起来像什么,例如Foo&lt;string,int&gt;
  • class Itemclass Item&lt;T&gt; 不同。所以string baseClass = "Item"; 是不准确的,如果你坚持删除细节,你将不得不“使用字符串”。
  • 你能把你想要的Foo&lt;Bar&lt;int&gt;&gt;也包括进来吗?
  • 抱歉,现在“编写代码”是否被认为是一种解决方法?我们在这里不是在谈论错误。

标签: c# generics reflection


【解决方案1】:

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

它适用于大多数事情,但可能有一两个极端情况无法正常工作。我之前写过,但现在看,我认为它不支持可空值。

/// 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();
}

【讨论】:

  • 您阅读我的问题了吗?我想要没有strings workaround 的ti,我知道如何删除` char 和单独的值,但我想要一个没有解决方法的代码。
  • 在那种情况下我不明白你的问题(是的,我已经彻底阅读了)。请查看其他人留下的 cmets,并准确说明您要达到的目标。
  • 我很感激你的回答,我知道我可以做一些你在上面发帖的事情,但我问是否有办法在没有这种方法的情况下获取类型的名称来删除`字符(需要处理字符串)如果Type 类型可以单独提供每个信息。还是谢谢你:)
  • @FelipeOriani 没有这种方法,因为每种 .NET 语言的格式类型都不同。 CLR 对 C# 或 VB.NET 语法一无所知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2013-07-03
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
相关资源
最近更新 更多