通用扩展方法,如何获取类型名称?

时间:2017-10-23 11:25:56

标签: c# extension-methods generic-type-argument

我创建了以下通用方法,我想知道TypeName ,它总是以对象数组的形式出现。

public static string ToJson<T>(this T entity)
{
    Type type = entity.GetType();
    return type.FullName; // or  type.Name
}

因此,如果我传递一个类Employee的实例,它将返回Object或Object数组。

我的电话就像

Employee emp = new Employee();

emp.ToJson();
调试时我正在获取System.Object或Object of Object,但它永远不是对象或对象的数组,它始终是某个类的实例。

1 个答案:

答案 0 :(得分:1)

typeNameobject[],因为entity object[]。还有什么其他原因?

如果您的代码如下,则会出现一个更有趣的问题:

public static string MyToJson<T>(this T entity)
{
     var type = typeof(T);
     return type.FullName;
}

错误......这不是一样的,毕竟T的类型和entity的类型是相同的,对吧?不,完全没有:

MyToJson((object)1); //will return System.Object
ToJson((object)1); //will return System.Int32

T通过类型推断在编译时解决,编译器在该精确时刻获得的信息;参数entity是类型化对象,因此T被推断为object。在您的代码中,您正在查询 runtime 中参数的类型,因此返回运行时类型,恰好是int