如何检查该类型是从某个接口c#继承的

时间:2010-12-02 11:57:47

标签: c# reflection inheritance interface

我有以下内容:

Assembly asm = Assembly.GetAssembly(this.GetType());

foreach (Type type in asm.GetTypes())
{
    MyAttribute attr = Attribute.GetCustomAttribute(type, typeof(MyAttribute))    as MyAttribute;
     if(attr != null && [type is inherited from Iinterface])
     {
        ...
     }

}

如何检查该类型是否继承自MyInterface?关键作品是否会以这种方式发挥作用?

谢谢。

5 个答案:

答案 0 :(得分:46)

不,is仅适用于检查对象的类型,而不适用于给定的Type。你想要Type.IsAssignableFrom

if (attr != null && typeof(IInterface).IsAssignableFrom(type))

请注意此处的订单。我发现我几乎总是使用typeof(...)作为通话的目标。基本上它返回true,目标必须是“父”类型,参数必须是“子”类型。

答案 1 :(得分:7)

答案 2 :(得分:2)

您好 您可以使用type.GetInterfaces() or type.GetInterface()来获取该类型实现的接口。

答案 3 :(得分:0)

鉴于最坏的情况;

如果您对类中的所有属性使用反射...

public List<PropertyInfo> FindProperties(Type TargetType) {

     MemberInfo[] _FoundProperties = TargetType.FindMembers(MemberTypes.Property,        
     BindingFlags.Instance | BindingFlags.Public, new
     MemberFilter(MemberFilterReturnTrue), TargetType);

     List<PropertyInfo> _MatchingProperties = new List<PropertyInfo>();

     foreach (MemberInfo _FoundMember in _FoundProperties)  {
     _MatchingProperties.Add((PropertyInfo)_FoundMember); }

     return _MatchingProperties;

}

IInterface是一些通用接口

   public void doSomthingToAllPropertiesInDerivedClassThatImplementIInterface() {

        IList<PropertyInfo> _Properties = FindProperties(this.GetType());
        foreach (PropertyInfo _Property in _Properties)
        {

            if (_Property.PropertyType.GetInterfaces().Contains(typeof(IInterface)))
            {
                if ((IInterface)_Property.GetValue(this, null) != null)
                {
                      ((IInterface)_Property.GetValue(this, null)).SomeIInterfaceMethod();  
                }
            }
        }
    }

答案 4 :(得分:-1)

意识到这已经很晚了,但是留待它参考: 我发现is运营商完成了这项工作 - 来自MSDN - http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx

在Jon Skeets的回答中使用resharper,也给了我“is”作为建议。