[英]Generic List method specifying type
在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
我认为只是
List<T> GetList<T>(string whatever) { /* ... */ }
你可以像
List<T> GetList<T>(string whatever)
where T : class
{ /* ... */ }
如果您想将其约束到类。
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);
编辑以回应评论:
如果要在方法内部构造一个新的“客户”,并希望该方法可以在任何类型上使用,则需要一个新的约束。 要拥有这个:
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
属性,并将其限制为仅与实现该接口的类型一起使用。
尝试这个:
List<T> getList<T>(String whatever) {
.
.
.
.
}
这要求调用者在调用方法时指定T的类型。
<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
两种语言的语法是如此接近
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.