可变类型的 IEnumerable

IEnumerable of variable type

在下面的示例中,我有一个名为 GetList 的方法,它接受一个字符串参数和 returns 一个列表实体。我在通用 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;

   ...
}

您可以使 GetList() 通用:

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

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

    // Populate list here

    return list;
}

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

最接近您想要的是 IEnumerable<dynamic>,因此您可以根据 运行 时间类型访问 属性 对象。

如果您只需要创建强类型可枚举到 return 到其他一些期望比 IEnumerable<object> 更好的代码,您可以使用反射来创建这种类型 (Create generic List<T> with reflection)。

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