试图返回一个泛型类型,并得到标题中描述的错误.我相信我做的事情很傻 - 建议赞赏......
public static IList<T> GetGroupById<T>(int groupId)
{
DashboardGroupType type = (DashboardGroupType)groupId;
IList<T> result = null;
var obj = default(T);
switch (type)
{
case DashboardGroupType.Countries:
break;
case DashboardGroupType.Customers:
// this returns a list of typ IEnumerable<Customer>
obj = (T) CustomerRepository.GetAllCustomers();
break;
case DashboardGroupType.Facilities:
// this returns a list of typ IEnumerable<Facility>
obj = (T) FacilityRepository.GetAllFacilities();
break;
case DashboardGroupType.Heiarchy:
break;
case DashboardGroupType.Lines:
break;
case DashboardGroupType.Regions:
// this returns a list of typ IEnumerable<string>
obj = (T) CustomerRepository.GetRegionsHavingCustomers();
break;
case DashboardGroupType.States:
// // this returns a list of typ IEnumerable<Customer>
obj = (T) CustomerRepository.GetStatesHavingCustomers();
break;
case DashboardGroupType.Tanks:
break;
default:
break;
}
result = result.Add(obj); // ERROR IS THROWN HERE
}
Run Code Online (Sandbox Code Playgroud)
该添加方法不返回任何东西.它只是更改列表.这就是你收到错误的原因.只需删除作业:
result.Add(obj);
Run Code Online (Sandbox Code Playgroud)
另一个问题是你没有初始化结果.运行代码时,您将收到NullReferenceException.你需要这样的东西:
IList<T> result = new List<T>();
Run Code Online (Sandbox Code Playgroud)
您还需要从此函数返回一个值.我猜你想要
return result;
Run Code Online (Sandbox Code Playgroud)
根据您的评论,方法CustomerRepository.GetAllCustomers();和类似的东西FacilityRepository.GetAllFacilities();返回IEnumerable<Customer>,或IEnumerable<Facility>,或类似的实例.你将这些转换为T.这意味着所有这些类型都必须可以转换为T.
我猜你想要的是把这些集合中的所有项目都添加到列表中.如果是这种情况,则应该转换为IEnumerable<T>,然后调用该AddRange方法.
总的来说,这似乎是一个非常糟糕的设计.根据您要实现的目标,可以使用继承和/或接口获得更好的设计.