Имя класса с общими параметрами?
Я пытаюсь сгенерировать код для серии общих классов, используя 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>
вам нужно написать немного логики для работы со строками. Тем не менее, это единственный способ узнать аргументы / параметры типа.