IEnumerable变量类型

时间:2016-09-23 16:20:33

标签: c# generics ienumerable

在下面的例子中,我有一个名为GetList的方法,它接受一个字符串参数并返回一个List实体。我在一个通用的IEnumerable变量中捕获它,因为在运行时我不知道用户可能想要什么实体。如何使用实际类型而不是对象?

我想替换这个...

IEnumerable<object> data = GetList(entityName);

有了......

IEnumerable<Company> data = GetList(entityName);

我现在能够想到处理它的唯一方法,因为我们有300多个实体,所以我不打算这样做

switch(entitName)
{
  case "Company":
   IEnumerable<Company> data = GetList(entityName);
   break;

  case "Employee":
   IEnumerable<Employee> data = GetList(entityName);
   break;

   ...
}

2 个答案:

答案 0 :(得分:2)

你不能在编译代码中使用这种类型 - 所以没有反射就没有办法创建它。

最近,你可以得到你想要的是IEnumerable<dynamic>,这样你就可以根据它们的运行时类型访问对象的属性。

如果你只需要创建强类型枚举来返回一些期望优于IEnumerable<object>的其他代码,你可以使用反射来创建这样的类型(Create generic List<T> with reflection)。

您也可以使用以强类型方式访问结果的泛型函数,但在使用MakeGenericMethod使用正确类型(How do I use reflection to call a generic method?)后,不要通过反射直接调用它。

答案 1 :(得分:0)

您可以GetList()通用:

IEnumerable<Company> data = GetList<Company>(entityName);

IEnumerable<T> GetList<T>(string entityName)
{
    List<T> list = new List<T>();

    // Populate list here

    return list;
}