【问题标题】:Convert .NET typename with generics to C# representation [duplicate]将具有泛型的 .NET 类型名转换为 C# 表示
【发布时间】:2016-02-02 11:31:03
【问题描述】:

我正在处理代码生成,在此任务期间,我需要创建可能包含类型参数的类型名的 C# 表示。

例如我需要从 "Dictionary`2[[int], [string]]" 获取 "Dictionary"

在一般情况下,这应该比字符串替换复杂得多。

更新以回答问题中的 cmets

  • 我正在生成源代码,
  • 我的输入是 Type.Fullname 作为字符串或 Type 对象(因为它们可以很容易地相互转换)。
  • 虽然不典型,但我的代码应该为 嵌套 类型参数准备。

【问题讨论】:

  • This 问题类似,但它指的是相反的方向,并且在这里没有可以提供帮助的答案,并且不只是替换字符串。
  • 到目前为止您尝试了什么?好像是 Typename`nrOfParameters[[par1],[par2]....]
  • 你只是生成文本源代码,还是真的使用类型构建器系统来构建类型?
  • 我确信这个问题之前已经被问过,但我无法轻易找到链接。您的输入是 Type 对象还是您指定格式的字符串?如果它是一个字符串,那么您的首要任务是为该语言编写一个词法分析器和解析器。你这样做了吗?
  • @DStanley:您提出的算法如何处理将整数映射到字符串列表的字典?

标签: c# generics


【解决方案1】:
public string ToCSharpType(Type type)
{
    if (!type.IsGeneric)
        return type.FullName;

    var result = new StringBuilder();
    string name = type.GetGenericTypeDefinition().FullName;
    result.Append(name.Substring(0, name.IndexOf('`'));
    result.Append('<');
    var args = type.GetGenericArguments();
    for (int i = 0; i < args.Length; i++)
    {
         result.Append(ToCSharpType(args[i]);
         if (i < args.Length - 1)
             result.Append(", ");
    }
    result.Append('>');
}

【讨论】:

  • 这是相反的方向。但是,@Servy 和 LukeH 指出了一个已经回答的相同问题,我可以使用它。谢谢!
  • 好的,我知道了。我已经编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2015-11-17
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多