C# 测试类型是否实现INotifyPropertyChanged?

C# 测试类型是否实现INotifyPropertyChanged?,c#,inotifypropertychanged,C#,Inotifypropertychanged,我在给定的类型上循环字段和属性,我想测试字段类型或属性类型是否实现了INotifyPropertyChanged 也许这听起来很奇怪,但我将解析字段/属性,例如字符串、整数和其他类型,但我也有一些observateCollection,例如我定义的一些自定义类型继承自inotifPropertyChanged 因此,在我的代码中,我想根据字段或属性是否实现了INotifyPropertyChanged进行一些测试。我认为您可以执行以下操作 if (property.Type is INotify

我在给定的
类型上循环字段和属性,我想测试字段类型或属性类型是否实现了
INotifyPropertyChanged

也许这听起来很奇怪,但我将解析字段/属性,例如字符串、整数和其他类型,但我也有一些
observateCollection
,例如我定义的一些自定义类型继承自
inotifPropertyChanged


因此,在我的代码中,我想根据字段或属性是否实现了INotifyPropertyChanged进行一些测试。

我认为您可以执行以下操作

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

注意,我假设您使用反射在属性之间循环,并且该属性的类型为PropertyInfo。

假设当您说遍历一个类的字段和属性时,您指的是标准反射,即您有类型为
PropertyInfo
FieldInfo
的对象

因此,对于
属性info
您可以执行以下操作:

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

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

Console.WriteLine(result != null);
对于一个
FieldInfo
非常类似,您只需要使用
fi.FieldType.GetInterface(“INotifiyPropertyChanged”)


更新:如果您已经有一个
System.Type
的对象,那么您可以直接在该对象上调用
GetInterface
方法,检查给定类型的实例是否实现了特定的接口。

您可以使用或:

或者一种更为通用的方法:

static bool SupportsInterface<T>(this Type type)
{
    if (!typeof(T).IsInterface) throw new InvalidOperationException();
    return type != null && type.GetInterfaces().Any(x => x == typeof(T));
}
静态布尔支持接口(此类型)
{
如果(!typeof(T).IsInterface)抛出新的InvalidOperationException();
返回类型!=null&&type.GetInterfaces().Any(x=>x==typeof(T));
}
要使用此模式:

var anyObject = FromTheVoid();

var objAsINotifyPropertyChanged = anyObject as INotifyPropertyChanged;

if(objAsINotifyPropertyChanged != null)
{
     objAsINotifyPropertyChanged.PropertyChanged += myHandled;
}
事实上,这取决于您的需要(您是否愿意反映,如果可用,请调用子类方法,等等)


[编辑]还解释为什么使用此模式更好。

如果您有系统,则标记为正确的答案不是确定此问题的最佳方法。键入您只需要执行以下操作:

bool isNotifyPropertyChanged = typeof(INotifyPropertyChanged).IsAssignableFrom(mytype);

@Matthieu-哎呀,在回答之前没有看到你的评论。@Matthieu,你联系的问题涉及不同的东西。OP没有说明,但他很可能使用反射来迭代属性和字段,因此您不能使用
is
@Guillaume Cogranne,您能确认我在回答中所做的假设是否正确,以便更新问题以消除歧义。是的,不能使用“is”,正如我在一些回答中告诉我的那样!亲密选民:这不是@Matthieu的链接问题的完全重复。我能得到关于为什么这被降级的回答吗?我没有降级,但
Type
不是
PropertyInfo
System的公共属性。Type
不实现
INotifyPropertyChanged
。如果我尝试:bool b=propertyType.GetInterface(typeof(INotifyPropertyChanged).ToString();我遇到了这个错误:错误1无法隐式地将type'System.type'转换为'bool'与FullName发生了完全相同的错误。事实上,这会返回一个字符串,而不是布尔值……我错了吗?如何调用这些函数
SupportsINotifyPropertyChanged()&SupportsInterface()
检查任何类是否已更改Implementation InotifyProperty?演示如何调用?我没有属性信息,只有一个系统。键入:他有一个
系统。键入
不是该类型的实际对象。我的答案确实不直接适用,
所以我的答案只是胡说八道,没有人会从中受益因为它是如此的不准确和错误。在这种情况下,每个人都应该对这篇文章投反对票。即使是Microsoft也应该在编译器中实现一个特殊规则来避免这种模式
我并不反对你的代码对某些人有效,只是OP问:“我在一个给定的<代码>类型/代码>的字段和属性上循环,我想测试字段类型或属性类型是否实现了<代码> NoTiffyPrimTyPrime。“我不认为”有用,但不适用答案“功利主义下注”…但我不会在这里辩论……这是一个宗教问题,不适合这样做。
bool isNotifyPropertyChanged = typeof(INotifyPropertyChanged).IsAssignableFrom(mytype);