我有以下内容:
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 会以这种方式工作吗?
谢谢你。
不,
is
仅适用于检查对象的类型,不适用于给定的Type
。你想要Type.IsAssignableFrom
:
if (attr != null && typeof(IInterface).IsAssignableFrom(type))
注意这里的顺序。我发现我几乎总是使用
typeof(...)
作为通话的目标。基本上要让它返回 true,目标必须是“父”类型,参数必须是“子”类型。
查看 IsAssignableFrom http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
嗨 您可以使用
type.GetInterfaces() or type.GetInterface()
来获取该类型实现的接口。
考虑到最坏的情况;
如果您对类中的所有属性使用反射...
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(); } } } }
您可以使用
type.IsAssignableTo(typeof(IInterface))
,因为它在以下情况之一返回 true
,如 MSDN 中所述:
意识到这已经很晚了,但留在这里供参考: 我发现 is 运算符可以完成这项工作 - 来自 MSDN - http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx
在 Jon Skeets 的回答上使用 resharper,也给了我“是”作为建议。