我需要浏览实现接口的所有属性,并且我有一个传递IsAssignableFrom condotion的IntPtr属性。
有没有其他方法可以检查属性是否实现了接口?
这是贯穿属性的方法:
protected void SetOwner()
{
IEnumerable<PropertyInfo> sourceProperties = this.GetType().GetProperties();
foreach (PropertyInfo pi in sourceProperties)
{
if (pi.Name != "Owner" && pi.DeclaringType.GetInterface("IOwnerSystem") != null)
//i tried this too: typeof(IOwnerSystem).IsAssignableFrom(pi.DeclaringType))
{
IOwnerSystem systm = (IOwnerSystem)pi.GetValue(this, null);
if (systm != null)
{
systm.Owner = this;
}
}
}
}
这是班级:
public abstract class Aircraft : OwnerSystem
{
//a bunch of properties...
public abstract IntPtr VideoWindow { get; }
}
答案 0 :(得分:5)
pi.DeclaringType
是声明属性的类型,不是属性的类型。在您的情况下,DeclaringType
是Aircraft
或其基类之一。您应该使用pi.PropertyType
代替。
答案 1 :(得分:0)
typeof(interface).IsAssignableFrom(intptr)
返回true
我无法确认您的假设是任何接口IsAssignableFrom(typeof(IntPtr))
:
interface I { }
…
Debug.Assert(!typeof(I).IsAssignableFrom(typeof(IntPtr)));
这个断言过去了,所以问题必须在其他地方;见Thomas Levesque's answer。
话虽如此,在我看来,使用IsAssignableFrom
比使用GetInterface
执行测试更好:我没有验证这一点,但我怀疑它有更好的性能,尤其是因为{ {1}}必须将类型名称绑定到某种类型。另一方面,GetInterface
由编译器直接转换为元数据标记;在运行时不需要绑定。