2013-09-18 2 views
2

Я хочу проверить, является ли значение типа ObservableCollection любого типа или нет в C#?Проверьте, является ли объект ObservableCollection или нет?

например: я могу проверить, является ли значение строкового типа или нет следующим образом:

string value = "value to Check"; 
bool b = value.GetType().Equals(typeof(string)); // b =true 

, но если мне нужно, чтобы проверить, является ли значение ObservableCollection или нет, независимо от учредительного типа, как может Я делаю это ?

например:

ObservableCollection<T> collection = new ObservableCollection<T>(); 

Если я проверяю, как этот

bool b = collection.GetType().Equals(typeof(ObservableCollection<>)); // b=false 

Как я могу проверить, является ли значение коллекции или нет ??

+1

возможно дубликат [Тип теста Generic коллекций] (http://stackoverflow.com/questions/10355635/generic-collections-type-test) – James

ответ

6

Попробуйте

bool b = collection.GetType().IsGenericType && 
      collection.GetType().GetGenericTypeDefinition() == typeof(ObservableCollection<>); 
1

тип коллекции является универсальным, вы хотите, чтобы проверить общее определение типа в:

collection.GetType() 
    .GetGenericTypeDefinition() 
    .Equals(typeof(ObservableCollection<>)) 
+1

Это приведет к сбою 'InvalidOperationException' в большинстве случаев, когда он должен был фактически вернуть' false' (т.е. для экземпляров не общих типов). –

3

Вы можете проверить это следующим образом:

public static bool IsObservableCollection(object candidate) { 
    if (null == candidate) return false; 

    var theType = candidate.GetType(); 
    bool itIs = theType.IsGenericType() && 
     !theType.IsGenericTypeDefinition()) && 
     (theType.GetGenericTypeDefinition() == typeof(ObservableCollection<>)); 

    return itIs; 
} 

Вы также можете получить тип элемента:

public static Type GetObservableCollectionElement(object candidate) { 
    bool isObservableCollection = IsObservableCollection(candidate); 
    if (!isObservableCollection) return null; 

    var elementType = candidate.GetType().GetGenericArguments()[0]; 
    return elementType; 
} 

РЕДАКТИРОВАТЬ

На самом деле с помощью ObservableCollection динамическим образом немного сложнее. Если вы посмотрите на ObservableCollection<T> в классе:

ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged 

вы заметите, что он расширяет Collection<T> и реализует 2 интерфейса.

Таким образом, поскольку каждый Collection<T> также необщего IEnumerable можно рассуждать о динамически известной ObservableCollection как так:

object someObject = ... 
bool itsAnObservableCollection = IsObservableCollection(someObject); 

if (itsAnObservableCollection) { 
    IEnumerable elements = someObject as IEnumerable; 
    // and try to reason about the elements in this manner 
    foreach (var element in elements) { ... } 

    INotifyCollectionChanged asCC = someObject as INotifyCollectionChanged; 
    INotifyPropertyChanged asPC = someObject as INotifyPropertyChanged; 
    // and try to let yourself receive notifications in this manner 
    asCC.CollectionChanged += (sender, e) => { 
     var newItems = e.NewItems; 
     var oldItems = e.OldItems; 
     ... 
    };  
    asPC.PropertyChanged += (sender, e) => { 
     var propertyName = e.PropertyName; 
     ... 
    }; 

} 
+0

Большое спасибо! Я искал это. :) Скажите, пожалуйста, как я могу найти счет этой коллекции после обнаружения того, что объект является коллекцией. –

+0

Проверьте ** править ** –

+0

Спасибо большое! Это решило мою проблему !! :) :) –

Смежные вопросы