Имя класса с общими параметрами?

Я пытаюсь сгенерировать код для серии общих классов, используя T4.

Я хочу знать, как получить полное имя класса, используя отражение?

public class Foo<TFirst, TSecond> {}

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

что я хочу, это полное имя с фактическими именами общих параметров, которые я написал

"Foo<TFirst, TSecond>"

Обратите внимание, что они не являются известным типом, так как я сказал, что я генерирую код с использованием T4, поэтому я хочу иметь точное именование, чтобы использовать его для генерации кода, например, внутри обобщенных методов.

Я попробовал это ответы, но они требуют, чтобы передать известный тип, который не то, что я хочу.

1 ответ

Решение

Вы можете получить доступ к именам параметров типа с помощью отражения, используя 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>); вы получите String а также Int32 в списке (а также более длинный type.FullName.)

Я сам не написал ни одного Т4, поэтому не знаю, имеет ли это какое-то значение для вас - чтобы добраться до Foo<TFirst, TSecond> вам нужно написать немного логики для работы со строками. Тем не менее, это единственный способ узнать аргументы / параметры типа.

Другие вопросы по тегам