2011-01-13 120 views
0

如果我有一個類型和對象如:通用型鑄造

- Type someType (coming from somewhere, could be any class eg. MyClass.GetType()) 
- Object someObject (eg. List<MyClass>()) 

,並希望把對象回List<MyClass>。我應該怎麼做?

+5

您的問題沒有意義,請舉例說明試圖完成。 – SLaks 2011-01-13 15:40:21

回答

1

你不能這樣做。泛型確保編譯時安全。由於只在運行時才知道實際類型,因此不能具有編譯時安全性。

0

你有一個運行時類型,你想執行編譯時間轉換。這不可能。也不清楚爲什麼你要這樣做首先。如果您對需要reflection的案件感興趣,也許您應該進一步調查該主題。

0

當您僅在運行時收到類型信息時,沒有辦法編譯時輸入變量。

這是從仿製藥不同的,因爲仿製藥你在編譯時類型信息:

void MyFunc<T>(T thing) 
{ 
    // T is passed in at compile time 
} 

你的情況,你所得到的運行時類型。因此,儘管你可以不理事國投的類型的方式,您通常會可以反映出在實例並調用其成員:

void MyFunc(object thing, Type type) 
{ 
    var res = t.GetMethod("Add").Invoke(a, new []{"someArg"}); 
} 
0

鑄造意味着明確指定要轉換的類型。既然你不知道你的類型是什麼,你不能施展它。

這並不意味着您無法訪問該列表。如果你知道你的目標是什麼列表,你可以將它轉換到非通用IList接口,它提供了大多數的方法和屬性,您需要:

object obj = GetMyList(); 
IList list = (IList)obj; 
object fifthItem = list[4]; 
list.RemoveAt(list.Count - 1); 

如果您所描述的問題,你」重新嘗試解決問題而不是解決方案,那麼可能會發布更適合的解決方案。

0

如果您正在編譯時嘗試運行一個運行時類型,那麼在我之前所說的是不可能的。
但是,你能騙一個小(但不要過度使用這種技術,它導致一條黑暗的道路......)

public void DoSomething<T>(List<T> object) where T : .... 
{ 
//do what you want here 
} 

public void CallIt(Type t, object o) //o is List<Foo> 
{ 
this.GetType().GetMethod("DoSomething").MakeGenericMethod(t).Invoke(o); 
} 

但是我沒有看到任何真正的利益這一點,因爲如果你不會寫任何類型的約束,而是使用泛型而不是對象和IList接口,如果你在那裏編寫任何基類或者接口,你可以將你的對象轉換爲對象。 (例如,如果你知道T實現了IFoo,你可以將o轉換爲IList <IFoo>並且擁有列表<Foo>的所有好處... ...