如果我有一個類型和對象如:通用型鑄造
- Type someType (coming from somewhere, could be any class eg. MyClass.GetType())
- Object someObject (eg. List<MyClass>())
,並希望把對象回List<MyClass>
。我應該怎麼做?
如果我有一個類型和對象如:通用型鑄造
- Type someType (coming from somewhere, could be any class eg. MyClass.GetType())
- Object someObject (eg. List<MyClass>())
,並希望把對象回List<MyClass>
。我應該怎麼做?
你不能這樣做。泛型確保編譯時安全。由於只在運行時才知道實際類型,因此不能具有編譯時安全性。
你有一個運行時類型,你想執行編譯時間轉換。這不可能。也不清楚爲什麼你要這樣做首先。如果您對需要reflection的案件感興趣,也許您應該進一步調查該主題。
當您僅在運行時收到類型信息時,沒有辦法編譯時輸入變量。
這是從仿製藥不同的,因爲仿製藥你在編譯時類型信息:
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"});
}
鑄造意味着明確指定要轉換的類型。既然你不知道你的類型是什麼,你不能施展它。
這並不意味着您無法訪問該列表。如果你知道你的目標是什麼列表,你可以將它轉換到非通用IList
接口,它提供了大多數的方法和屬性,您需要:
object obj = GetMyList();
IList list = (IList)obj;
object fifthItem = list[4];
list.RemoveAt(list.Count - 1);
如果您所描述的問題,你」重新嘗試解決問題而不是解決方案,那麼可能會發布更適合的解決方案。
如果您正在編譯時嘗試運行一個運行時類型,那麼在我之前所說的是不可能的。
但是,你能騙一個小(但不要過度使用這種技術,它導致一條黑暗的道路......)
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
>的所有好處... ...
您的問題沒有意義,請舉例說明試圖完成。 – SLaks 2011-01-13 15:40:21