2014-10-09 180 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