Проверить, реализует ли тип INotifyPropertyChanged? - PullRequest
2 голосов
/ 30 ноября 2011

Я зацикливаюсь на полях и свойствах данного Type, и я хотел бы проверить, реализует ли тип поля или свойство Type INotifyPropertyChanged.

Возможно, это звучит странно, но я будуразбирать поля / свойства, такие как строки, целые и другие типы, но у меня также есть, например, некоторые ObservableCollection и некоторые определенные мной пользовательские типы, которые наследуются от INotifyPropertyChanged.

Так что в моем коде янравится делать некоторые тесты, основанные на том факте, что поле или свойство реализует INotifyPropertyChanged или нет.

Ответы [ 5 ]

2 голосов
/ 30 ноября 2011

Предполагая, что когда вы говорите, просматривая поле и свойства класса, вы имеете в виду стандартное отражение, а именно, у вас есть объекты типа PropertyInfo и FieldInfo.

Так что для PropertyInfo вы можете сделать следующее:

var pi = typeof(DateTime).GetProperty("Now");

var result = pi.PropertyType.GetInterface("INotifiyPropertyChanged");

Console.WriteLine(result != null);

А для FieldInfo очень похоже, и вам просто нужно использовать fi.FieldType.GetInterface("INotifiyPropertyChanged").


Обновление: Если у вас уже есть объект System.Type, вы можете вызвать метод GetInterface непосредственно для этого объекта, чтобы проверить, реализуют ли экземпляры данного типа конкретный интерфейс или нет.

2 голосов
/ 30 ноября 2011

Вы можете использовать GetInterface или GetInterfaces:

static bool SupportsINotifyPropertyChanged(this Type type)
{
    return null != type.GetInterface(typeof(INotifyPropertyChanged).FullName);
    // or
    // return type.GetInterfaces().Any(x => x == typeof(INotifyPropertyChanged));
}

Или чуть более общий подход:

static bool SupportsInterface<T>(this Type type)
{
    if (!typeof(T).IsInterface) throw new InvalidOperationException();
    return type != null && type.GetInterfaces().Any(x => x == typeof(T));
}
0 голосов
/ 01 декабря 2011

Ответ, помеченный как правильный, не лучший способ определить это, если у вас есть System.Type, вам просто нужно сделать это:

bool isNotifyPropertyChanged = typeof(INotifyPropertyChanged).IsAssignableFrom(mytype);
0 голосов
/ 30 ноября 2011

Рекомендуемый подход заключается в использовании этого шаблона:

var anyObject = FromTheVoid();

var objAsINotifyPropertyChanged = anyObject as INotifyPropertyChanged;

if(objAsINotifyPropertyChanged != null)
{
     objAsINotifyPropertyChanged.PropertyChanged += myHandled;
}

Если это так, это зависит от ваших потребностей (хотите ли вы задуматься, вызывать методы дочернего класса, если они доступны, и т. Д.).

[Редактировать] Запись в блоге «FxCop: не бросайте без необходимости» также объясняет, почему этот шаблон лучше использовать.

0 голосов
/ 30 ноября 2011

Я думаю, вы можете сделать следующее.

if (property.Type is INotifyPropertyChanged) 
{
    //Do something
}

Обратите внимание, я предполагаю, что вы просматриваете свойства, используя отражение, и это свойство имеет тип PropertyInfo.

...