如何获取泛型类型参数的类型名称?

如果我有一个类似

public string myMethod<T>( ... )

如何在方法内部获得作为类型参数给出的类型的名称?我想做一些类似于 typeof(T).FullName的东西,但实际上是可行的..。

92529 次浏览

你的代码应该可以工作。 typeof(T).FullName是完全有效的。这是一个完全正常运行的编译程序:

using System;


class Program
{
public static string MyMethod<T>()
{
return typeof(T).FullName;
}


static void Main(string[] args)
{
Console.WriteLine(MyMethod<int>());


Console.ReadKey();
}


}

运行以上输出(正如预期的那样) :

System.Int32

假设您有一个 T 的实例,那么它与其他类型没有什么不同。

var t = new T();


var name = t.GetType().FullName;

typeof(T).Nametypeof(T).FullName对我很有用。我得到了作为参数传递的类型。

此扩展方法输出非泛型类型的简单类型名称,并追加泛型类型的泛型参数列表。对于不需要担心内部泛型参数(如 IDictionary<int, IDictionary<int, string>>)的场景,这种方法工作得很好。

using System;
using System.Linq;


namespace Extensions
{
public static class TypeExtensions
{
/// <summary>
/// Returns the type name. If this is a generic type, appends
/// the list of generic type arguments between angle brackets.
/// (Does not account for embedded / inner generic arguments.)
/// </summary>
/// <param name="type">The type.</param>
/// <returns>System.String.</returns>
public static string GetFormattedName(this Type type)
{
if(type.IsGenericType)
{
string genericArguments = type.GetGenericArguments()
.Select(x => x.Name)
.Aggregate((x1, x2) => $"{x1}, {x2}");
return $"{type.Name.Substring(0, type.Name.IndexOf("`"))}"
+ $"<{genericArguments}>";
}
return type.Name;
}
}
}

你的代码应该能用。您还可以获取类的名称,而不是包含命名空间的完整名称,例如:

using System;


namespace ConsoleApp1
{
class Program
{
public static string GettingName<T>() => typeof(T).Name;


public static string GettingFullName<T>() => typeof(T).FullName;


static void Main(string[] args)
{
Console.WriteLine($"Name: {GettingName<decimal>()}");
Console.WriteLine($"FullName: {GettingFullName<decimal>()}");
}
}
}

运行上述程序的输出是:

Name: Decimal
FullName: System.Decimal

这里有一个你可以试用的上述代码的小提琴

private static string ExpandTypeName(Type t) =>
!t.IsGenericType || t.IsGenericTypeDefinition
? !t.IsGenericTypeDefinition ? t.Name : t.Name.Remove(t.Name.IndexOf('`'))
: $"{ExpandTypeName(t.GetGenericTypeDefinition())}<{string.Join(',', t.GetGenericArguments().Select(x => ExpandTypeName(x)))}>";