Подтвердить что ты не робот

Как проверить, что тип наследуется от некоторого интерфейса С#

У меня есть следующее:

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? Будет ли работа с ключом работать таким образом?

Спасибо.

4b9b3361

Ответ 1

Нет, is работает только для проверки типа объекта, а не для заданного Type. Вы хотите Type.IsAssignableFrom:

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

Обратите внимание на порядок здесь. Я считаю, что почти всегда использую typeof(...) как цель вызова. В основном для того, чтобы он возвращал true, цель должна быть "родительским" типом, а аргумент должен быть "дочерним" типом.

Ответ 3

Привет Вы можете использовать type.GetInterfaces() or type.GetInterface() для получения интерфейсов, которые реализует тип.

Ответ 4

Учитывая худший сценарий;

если вы используете отражение над всеми свойствами в классе...

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

Ответ 5

Поймите это очень поздно, но оставив его здесь для справки: Я нашел, что оператор выполняет эту работу - от MSDN - http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx

Используя resharper на Jon Skeets ответ, дал мне "есть" также как предложение.