Как проверить, что тип унаследован от некоторого интерфейса c # - PullRequest
26 голосов
/ 02 декабря 2010

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

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 ]

46 голосов
/ 02 декабря 2010

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

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

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

7 голосов
/ 02 декабря 2010
2 голосов
/ 02 декабря 2010

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

0 голосов
/ 11 июля 2013

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

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

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 голосов
/ 29 октября 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...