2014-10-09 101 views
0

的。如果我有以下几点:方法返回动态类型列表

class Super { 
//stuff 
} 

class Sub1 : Super { 
//stuff 
} 

class Sub2 : Super { 
//stuff 
} 

class Sub3 : Super { 
//stuff 
} 

运行类

class Run { 

//list of type Super with a bunch of sub objects (sub1,sub2,sub3) 
List<Super> superList = sub1,2,3 list; 
List<Super> partialSuperList; 

void doStuff() { 
    Type subObjectType = superList[0].GetType(); 
    if (subObjectType == typeof(sub1)) { 
    partialSuperList = categorize(subObjectType); 
    } else if (subObjectType == typeof(sub2)) { 
    partialSuperList = categorize(subObjectType); 
    } else if (subObjectType == typeof(sub3)) { 
    partialSuperList = categorize(subObjectType); 
    } 
} 

List<Super> categorize(Type type) { 
    List<type> subTypeList = new List<type>(); 
    //loop through subtype list and add it to a super type list 
    return SuperList; 
} 
} 

,你可以看到我想要动态地创建列表,并附有“型”来了从论证到方法,我是这样做的还是有另一种方法来做到这一点?

+0

这听起来像是一个可怕的设计... – 2014-10-09 13:19:43

+0

@PatrickHofman这是为什么,我试图避免重蹈内4线if/else语句,只是打电话,做它 – 2014-10-09 13:20:36

+0

并非一切都意味着一个1线法是通用的,你真的不应该为你所期望的每一种类型创建'if',这只是不好的做法。 – 2014-10-09 13:28:02

回答

1

使该方法一般:

List<T> doStuff<T>() where T : Super 
{ 
    List<T> list = new List<T>(); 

    // use list 
} 

您现在没有铸造问题,您可以使用is检查T

if (T is Sub1) 
{ 
    ... // do something 
} 
+0

但我需要一个参数,返回一个类型,所以我可以创建正确类型的列表 - 我看,我会尝试编辑 – 2014-10-09 13:21:26

+0

@AbdulAhmad:这是可能的。参见'List '的用法。 – 2014-10-09 13:23:06

+0

好的,现在看,谢谢! – 2014-10-09 13:23:36

3

很难判断你是否正确地做了正确的事情,因为你的伪代码现在不能编译。

我想你正在尝试基于某种类型筛选列表。我认为Linq方法OfType<TResult>是你正在寻找的。

var superList = new List<Super> { ... }; 
var sub1List = superList.OfType<Sub1>().ToList(); 
var sub2List = superList.OfType<Sub2>().ToList(); 
var sub3List = superList.OfType<Sub3>().ToList(); 

如果你想在你不知道在编译时一个类型过滤,则可以执行以下操作:

var superList = new List<Super> { ... }; 
var someType = superList.First().GetType(); 
var filteredSuperList = superList.Where(x => x.GetType() == someType).ToList(); 
+1

由于'type'在这里是动态的,因此不起作用。它只会在'type'是一个实际的类型,而不是对它的引用时才起作用。 – 2014-10-09 13:18:49

+0

我可以改变它编译,给我一分钟 – 2014-10-09 13:19:42

+1

@PatrickHofman不完全。如果你看看这个问题,OP首先使用'typeof(Sub1)'检查特定的类型,而不是将该类型赋予'categorize'方法。为什么不直接使用它作为通用?除了标题,“动态”这个词在任何地方都没有提及。 – Maarten 2014-10-09 13:21:03