我有以下内容:
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?关键作品是否会以这种方式发挥作用?
谢谢。
答案 0 :(得分:46)
不,is
仅适用于检查对象的类型,而不适用于给定的Type
。你想要Type.IsAssignableFrom
:
if (attr != null && typeof(IInterface).IsAssignableFrom(type))
请注意此处的订单。我发现我几乎总是使用typeof(...)
作为通话的目标。基本上它返回true,目标必须是“父”类型,参数必须是“子”类型。
答案 1 :(得分:7)
查看IsAssignableFrom http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
答案 2 :(得分:2)
您好
您可以使用type.GetInterfaces() or type.GetInterface()
来获取该类型实现的接口。
答案 3 :(得分: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(); } } } }
答案 4 :(得分:-1)
意识到这已经很晚了,但是留待它参考: 我发现is运营商完成了这项工作 - 来自MSDN - http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx
在Jon Skeets的回答中使用resharper,也给了我“is”作为建议。