【问题标题】:How do i know if a method wasn't derived from base classes C#我如何知道方法不是从基类 C# 派生的
【发布时间】:2018-11-26 02:28:36
【问题描述】:

鉴于这段代码,我如何使用“i”变量知道该方法不是从基类派生的,而是在最低级转换的类中声明的? 例如,我不需要打印任何 GetType()、ToString() 等方法。

MethodInfo[] methods = Type.GetType(
            "Probabilities_Theory.ProbabilitiesTheory").GetMethods();

foreach (var i in methods)
{
    if (!i.IsVirtual) // another condition needed
        Console.WriteLine(i);
}

我不需要知道它是否被覆盖,因为例如 GetType() 方法不是虚拟的。但我仍然不希望 GetType() 被打印出来。

GetType() 和其他虚拟方法的共同点是它们都没有在最低级转换的类中声明。

我可以这样做:

if (i.DeclaringType == typeof(ProbabilitiesTheory))
    Console.WriteLine(i);

但我希望我的代码更加自动化,更加程序化。就像一个不知道它是什么类型的一样。

【问题讨论】:

标签: c# system.reflection


【解决方案1】:

试试BindingFlags.DeclaredOnly:

MethodInfo[] methods = Type.GetType("Probabilities_Theory.ProbabilitiesTheory")
                           .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

【讨论】:

  • 为什么没有成功。我从执行中得到了一个 0 个元素的数组
  • 如果你给bindingFlags,你必须给所有相关的,所以BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)
  • @KlausGütter 你是对的,我错过了这一点,感谢您的更正。 :)
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2018-11-11
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
相关资源
最近更新 更多