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

问题描述 投票:0回答:6

我有以下内容:

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 继承的? keywork 会以这种方式工作吗?

谢谢你。

c# reflection inheritance interface
6个回答
59
投票

不,

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

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

注意这里的顺序。我发现我几乎总是使用

typeof(...)
作为通话的目标。基本上要让它返回 true,目标必须是“父”类型,参数必须是“子”类型。



3
投票

嗨 您可以使用

type.GetInterfaces() or type.GetInterface()
来获取该类型实现的接口。


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

0
投票

您可以使用

type.IsAssignableTo(typeof(IInterface))
,因为它在以下情况之一返回
true
,如 MSDN 中所述:

  • 当前实例和targetType代表相同的类型。
  • 当前类型直接或间接从 targetType 派生。如果当前类型继承自targetType,则直接从targetType派生;如果当前类型继承自一系列继承自 targetType 的一个或多个类,则当前类型是从 targetType 间接派生的。
  • targetType 是当前类型实现的接口。
  • 当前类型是泛型类型参数,targetType代表当前类型的约束之一。

-1
投票

意识到这已经很晚了,但留在这里供参考: 我发现 is 运算符可以完成这项工作 - 来自 MSDN - http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx

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

© www.soinside.com 2019 - 2024. All rights reserved.