通用列表方法指定类型

时间:2011-09-02 21:28:46

标签: c# .net generics

在Java中,我可以使用类似这样的方法声明:

<T> List<T> getList(final Class<T> objectClass, String whatever)

这意味着我通过为方法指定Class来指定列表返回类型。

List<Customer> customers = getList(Customer.class, "blah");

如果我没有正确指定类,我会收到编译时错误。 (这就是我正在寻找的 - 我希望编译器能够找到不匹配的东西。)

List<String> customers = getList(Customer.class, "blah"); // will not compile

C#中的相同内容是什么? TIA

4 个答案:

答案 0 :(得分:3)

我认为这只是

List<T> GetList<T>(string whatever) { /* ... */ }

你可以在T上设置约束

List<T> GetList<T>(string whatever) 
 where T : class
{ /* ... */ }

如果你想把它限制在类中。

答案 1 :(得分:3)

C#中没有办法让编译器根据返回类型推断泛型类型。

在C#中,如果唯一的区别是返回类型,则必须指定T:

List<Customer> customer = getList<Customer>("blah");

此方法将写为:

List<T> getList<T>(string whatever) { ... }

但是,在C#中,如果存在一个接受客户类型的参数,则会自动处理类型推断。例如,您可以:

List<T> MakeList<T>(params T[] items) { ...}

然后将其称为(不含<Customer>):

 Customer one = GetCustomer(1);
 Customer two = GetCustomer(2);

 var customers = MakeList(one, two);

编辑以回应评论:

如果您打算在方法中构建一个新的“Customer”,并希望它适用于任何类型,那么您需要一个新的约束。要有这个:

List<Customer> customers = GetList<Customer>("blah");

您需要以下内容:

List<T> GetList<T>(string whatever) 
   where T : new() // This lets you construct it internally
{
     List<T> results = new List<T>();

     /// ...
     T newInstance = new T();

     results.Add(newInstance);
     return results;
}

话虽如此,如果您要制作这样的方法,您可能还希望对接口有约束,因此您可以设置您创建的对象:

List<T> GetList<T>(string whatever) 
   where T : ISomeInterface, new()

这将允许您在方法中使用ISomeInterface的属性,并将其限制为仅使用实现该接口的类型。

答案 2 :(得分:2)

试试这个:

List<T> getList<T>(String whatever) {
.
.
.
.
}

这要求调用者在调用方法时指定T的类型。

答案 3 :(得分:1)

  

<T> List<T> getList(final Class<T> objectClass, String whatever)

为:

List<T> GetList<T>(string whatever)
  

List<Customer> customers = getList(Customer.class, "blah");

为:

List<Customer> customers = GetList<Customer>("blah");
  

List<String> customers = getList(Customer.class, "blah"); //将无法编译

为:

List<string> = GetList<Customer>("blah"); // will not compile too

两种语言的语法如此接近