可变类型的 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
后通过反射直接调用它。
在下面的示例中,我有一个名为 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
后通过反射直接调用它。