【问题标题】:Determining derived classes through reflection通过反射确定派生类
【发布时间】:2013-05-12 21:30:27
【问题描述】:

我想处理从类 A 派生的类的方法。类 A 和派生类位于不同的程序集中。我使用反射从派生程序集中获取所有 System.Type 并遍历它们的方法。

Assembly A: class Template {...}
Assembly B: class X: A.Template {...}
Assembly B: class Y: A.Template {...}
Assembly B: class Z: A.Template {...}

当我尝试在程序集B 中迭代X 类的方法时,它包括A 类的所有方法。我想要实现的是仅遍历派生类中存在的那些方法。

我认为在不同的程序集中根本不重要,但即使我尝试根据程序集过滤方法的声明类型,它也不起作用。

我曾尝试使用MethodInfo 对象的各种属性,但无法将其过滤掉。我确信我错过了一些愚蠢的检查,但已经为此苦苦挣扎了足够长的时间。

任何建议将不胜感激。

【问题讨论】:

  • BindingFlags.DeclaredOnly 有帮助吗?
  • 您是否尝试过使用DeclaredOnly 绑定标志获取方法? typeof(X).GetMethods(BindingFlags.DeclaredOnly)
  • 谢谢。我实际上是在寻找私有方法、字段和属性,但没有意识到您必须使用 BindingFlags.Instance | BindingFlags.NonPublic 标志。那,除了 BindingFlags.DeclaredOnly 工作。

标签: c# .net inheritance reflection


【解决方案1】:

您可以使用它来获取程序集中的所有派生类型:

Assembly b = Assembly.LoadFrom(@"c:\B.dll");
var derivedTypes = b.GetTypes().Where(t => typeof(Template).IsAssignableFrom(t));

这可以找到在该类型上定义的任何方法:

Type derived = ...
var methods = derived.GetMethods(BindingFlags.Instance | 
                                 BindingFlags.Public | 
                                 BindingFlags.DeclaredOnly);

或者这个:

var methods = derived.GetMethods().Where(m => m.DeclaringType == derived);

但是,如果您想查找在 Template 的任何子类(例如 X 的子类)上定义的方法,请使用:

Type templateType = typeof(Template);
Type derived = ...
var methods = derived.GetMethods()
                     .Where(m => templateType.IsAssignableFrom(m.DeclaringType) &&
                                 templateType != m.DeclaringType);

【讨论】:

  • 谢谢。我实际上是在寻找私有方法、字段和属性,但没有意识到您必须使用 BindingFlags.Instance | BindingFlags.NonPublic 标志。那,除了 BindingFlags.DeclaredOnly 工作
猜你喜欢
  • 2016-05-24
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多