2016-09-23 151 views
0

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

    ... 
} 
+0

'GetList(entityName).Cast ()' –

+0

虽然我不知道它会是公司。它可能是员工或角色等..我唯一的信息是一个字符串(entityName)表示他们想要查询的实体。 – jjf1978

+0

那么,在这种情况下,你应该保持你的对象。编译器也不会为你知道。你将不得不做出一些类型的猜测来知道你正在使用什么类型。或者您需要向我们提供代码执行的环境,以便我们找到解决方法。 –

回答

2

你不能在符合的代码中使用这种类型 - 所以真的没有办法在没有反射的情况下创建它。

最接近你可以得到你似乎想要的是IEnumerable<dynamic>所以你可以基于他们的运行时类型访问对象的属性。

如果您只是需要创建强类型枚举以返回其他代码,那么其效果会比IEnumerable<object>更好,您可以使用反射来创建此类型(Create generic List<T> with reflection)。与其说这是直接使用MakeGenericMethod用正确的类型(How do I use reflection to call a generic method?)后,通过反射调用它

您可能还可以有访问结果在强类型的方式,但通用功能。

+1

谢谢!真正的答案,而不是snark :) – jjf1978

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; 
} 
+0

我不能指定typ因为我所要做的只是一个字符串。最终用户单击一个将字符串返回给我的应用程序的列表,然后应用程序必须获取该实体。所以我不能硬编码GetList jjf1978

+2

如果你不知道任何关于它的事情,你如何期望对你回来的列表做任何有意义的事情? – itsme86

+0

这正是问题所在。关于我所能做的与返回列表是databind它。我可以使用反射来痛苦地看所有的属性,但我真的不想这样做......基本上我想要一个变量类型 – jjf1978