2014-02-10 64 views
1

我想投一個WPF dataGridObservableCollectionItemSource,但我不知道它的元素的類型,所以我想使用此代碼來獲取類型:如何使用ObservableCollection中的GetType返回的類型<T>?

var returnedType = dg.ItemsSource.AsQueryable().ElementType; 

,並使用returnedType在這裏:

var sourceCollection = (ObservableCollection<???>)dg.ItemsSource; 

更清楚,我想將它扔在ObservableCollection,因爲我需要使用它的CollectionChanged。而且,因爲我想在customizad DataGrid使用它,我不能在這裏使用泛型類型。

+3

這個問題是荒謬的。如果您在編譯時不知道項目類型,那麼您將如何在代碼中使用該未知類型的實例?我的意思是,你會在這一行中的點之後寫什麼:'sourceCollection [0] .'? – Dennis

+1

我不熟悉WPF,但我不認爲你可以像這樣投下整個集合。你可以嘗試使用Cast <>'擴展方法。 – Tarec

+1

@Tarec它取決於'ItemsSource'已經是'ObservableCollection '。如果是這樣,那麼鑄造到它已經有的類型是很好的。 (但是正如丹尼斯指出的那樣,如果你在編譯時不知道'T',那麼即使可能,演員也是無用的。)如果不是,那麼你是對的,演員會扔出一個例外。我懷疑後者是這種情況。 – hvd

回答

4

ObservableCollection<T>實現了INotifyCollectionChanged接口,並且您需要的事件在此接口上定義。所以你可以寫這樣的代碼:

var sourceCollection = (INotifyCollectionChanged)dg.ItemsSource; 
sourceCollection.CollectionChanged += ... your delegate here ... 
+0

那太聰明瞭,謝謝你。 –

0

ObservableCollection<>源自Collection<>,因此您可以將其轉換爲IListICollection並以此方式訪問集合。但是,您必須將集合中的項目視爲object

0

您可以擁有該類型的接口並讓您的運行時類型實現該接口。

+0

你實現了一個接口編譯時間 –

+0

這就是我的意思。運行時類型必須可轉換爲該接口。 –

0

downcast是一個編譯時構造,讓編譯知道你知道更多的編譯是關於對象的運行時類型。如果您在編譯時不知道該類型,則不能使用強制轉換。

但是,如果你不知道實際的類型,你將無法在後來做很多事情。你將如何訪問一個未知類型的對象的屬性?

一般有會是處理未知類型的,他們有一些共性問題,兩種不同的方法之一將是動態語言運行時

dynamic sourceCollection = dg.ItemsSource; 

你可以使用這個,如果你知道,所有的物體都會有例如一個Value屬性,但它們不共享聲明該屬性的公共基類型。

sourceCollection.Value 

會在這種情況下是合法的(只要約束條件不被破壞工作)

也許更多的時候你能夠通過sourceCollection到接受一個ObservableCollaction<T>作爲一種方法參數

或者您可以使用泛型

public ObservableCollection<T> GetSourceCollection(DataGrid dg) { 
    (ObservableCollection<T>)dg.ItemsSource 
} 

這隻能推遲不知道類型某處喲其他的問題你的代碼,但你應該知道收集的類型在某個時刻,你會經常能夠推動這個問題,直到這一點。

0

雖然,它不清楚你需要什麼,如果你不知道在編譯時它的類型或抽象是什麼,它將是什麼用途的泛型。 這裏有一個辦法:

var returnedType = dg.ItemsSource.AsQueryable().ElementType; 
Type generic = typeof(ObservableCollection<>);  
Type specific = generic.MakeGenericType(typeof(returnedType));  
ConstructorInfo ci = specific.GetConstructor(Type.EmptyTypes);  
object o = ci.Invoke(new object[] { }); 

對象o是你ObservableCollection<returnedType >

如果你需要在它上面調用ObservableCollections的任何方法,你將需要反射來完成。

+1

參考類型不包裝 –

+0

@RuneFS真,錯用的術語。 –

相關問題