在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
答案 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
两种语言的语法如此接近