typeof(interface).IsAssignableFrom(intptr)返回true

时间:2014-08-18 08:27:36

标签: c#

我需要浏览实现接口的所有属性,并且我有一个传递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; }
}

2 个答案:

答案 0 :(得分:5)

pi.DeclaringType是声明属性的类型,不是属性的类型。在您的情况下,DeclaringTypeAircraft或其基类之一。您应该使用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由编译器直接转换为元数据标记;在运行时不需要绑定。