Как проверить, что тип наследуется от некоторого интерфейса С#
У меня есть следующее:
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? Будет ли работа с ключом работать таким образом?
Спасибо.
Ответы
Ответ 1
Нет, is
работает только для проверки типа объекта, а не для заданного Type
. Вы хотите Type.IsAssignableFrom
:
if (attr != null && typeof(IInterface).IsAssignableFrom(type))
Обратите внимание на порядок здесь. Я считаю, что почти всегда использую typeof(...)
как цель вызова. В основном для того, чтобы он возвращал true, цель должна быть "родительским" типом, а аргумент должен быть "дочерним" типом.
Ответ 2
Проверьте IsAssignableFrom
http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
Ответ 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 ответ, дал мне "есть" также как предложение.