2

我正在尝试使用 T4 为一系列通用类生成代码。

我想知道如何使用反射获得完整的类名?

public class Foo<TFirst, TSecond> {}

var type = typeof(Foo<,>);
var name = type.FullName; // returns "Foo`2"

我想要的是我写的带有实际通用参数名称的全名

"Foo<TFirst, TSecond>"

请注意,它们不是已知类型,正如我所说,我正在使用 T4 生成代码,所以我希望有准确的命名以将其用于代码生成,例如,在泛型方法中。

我尝试了这个答案,但他们需要传递已知类型,这不是我想要的。

4

1 回答 1

4

您可以使用以下方法通过反射访问类型参数名称Type.GetGenericArguments

using System;

public class Foo<TFirst, TSecond> {}

class Test
{
    static void Main()
    {
        var type = typeof(Foo<,>);
        Console.WriteLine($"Full name: {type.FullName}");
        Console.WriteLine("Type argument names:");
        foreach (var arg in type.GetGenericArguments())
        {
            Console.WriteLine($"  {arg.Name}");
        }
    }
}

请注意,这是给类型参数名称,因为您使用了泛型类型定义;如果你使用过var type = typeof(Foo<string, int>);,你会得到StringInt32列出(以及更长的type.FullName.)

我自己没有写过任何 T4,所以我不知道这对你有没有用 - 为了得到Foo<TFirst, TSecond>你需要写一些字符串操作逻辑。但是,这是我知道的获取类型参数/参数的唯一方法。

于 2017-10-14T14:18:28.367 回答