繁体   English   中英

通用列表方法指定类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM