如何将泛型类型T作为函数C#中声明的对象

时间:2010-07-23 10:47:19

标签: c#

    public static List<T> GetColumnValuesByHeader<T>(string docName)
    {
      //  How can i get T as Customer or Employee in here?    
    }

List<Customer> customers = GetColumnValuesByHeader<Customer>("Customers.dat")
List<Employee> employees= GetColumnValuesByHeader<Employee>("Employees.dat")

5 个答案:

答案 0 :(得分:4)

使用typeof(T)

public static List<T> GetColumnValuesByHeader<T>(string docName)
{
    // Will print Customer or Employee appropriately
    Console.WriteLine(typeof(T));
}

现在你究竟用它做什么取决于你......

如果你真的需要以不同的方式处理这些案例,那么我很想写一些单独的方法来开始。泛型实际上是针对任何类型的行为相同的算法而设计的。当然,每条规则都有例外 - 例如Enumerable.Count<T>中的优化......例如,如果您通过反射获取属性,那么这是合理使用typeof(T)

答案 1 :(得分:2)

正如Jon Skeet所说,您可以使用typeof来获取T的类型。您还可以使用Activator class来创建该类的实例。

Type theType = typeof(T);
object obj = Activator.CreateInstance(theType);

答案 2 :(得分:1)

假设您要创建许多T来填充列表,最简单的方法是使用Activator.CreateInstance<T>();。您希望将where T : new()约束添加到您的方法中,以简化此操作。它假设Customer和Employee都有一个默认构造函数 - 如果不是这样,你仍然可以使用CreateInstance(),但你需要通过获取{{1}来获取正确的参数。对于每种类型。

答案 3 :(得分:0)

您可以使用typeof ..

获取T的类型
Type t = typeof(T);
if (t == typeof(Employee))
{
    //Do something here ...
}

答案 4 :(得分:-2)

if (type of T Is Customer) {
 //Perform action for customer
} else

if (type of T Is Employee) {
 //Perform action for Employee
}