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);