【问题标题】:How to find all methods that are declared as virtual in c# using reflection?如何使用反射查找在 c# 中声明为虚拟的所有方法?
【发布时间】:2014-07-30 10:45:42
【问题描述】:

例如

public class UserInfo {}

public interface IUser
{
  UserInfo Get(int id);
  string GetData(int id);
}

public class User : IUser
{
    public UserInfo Get(int id)
    {
        return null;
    }
    public virtual string GetData(int id)
    {
        return null;
    }
}

我尝试了以下方法,但两种方法都返回 true。

MethodInfo[] methods=typeof(User).GetMethods();
foreach(MethodInfo method in methods)
{
   if(method.IsVirtual)
   {
      Console.WriteLine(method.Name);
   }
}

预期输出

GetData

实际输出

Get
GetData

此链接有些相似,但在我的情况下不起作用: use-reflection-to-find-all-public-virtual-methods-and-provide-an-override

【问题讨论】:

  • Works for me。你能提供一个真实的、最小的、可编译的、可运行的例子吗?
  • 确实,我必须做很多事情来测试原始问题:1)添加一个 UserInfo 类。 2) 添加一个 IUser 类。 3) 修复“P”是公开的。 4) 使用typeof(User) 而不是typeof(Base)。这些都不是回答问题的人应该做的事情。以后请提供简短但完整的代码示例。

标签: c# reflection virtual


【解决方案1】:

问题是Get 是一个虚拟方法,因为它实现了IUser.Get,所以使用执行时调度调用 - 我怀疑,无论如何。 (你还没有给我们一个完整的程序,所以我不得不猜测。)

如果你真的想要“可以被覆盖的方法”,你还需要检查MethodBase.IsFinal。所以只需将循环更改为:

foreach (MethodInfo method in methods)
{
   if (method.IsVirtual && !method.IsFinal)
   {
      Console.WriteLine(method.Name);
   }
}

【讨论】:

  • 这是正确的,如果您(OP)从您的 User 类中删除 IUser 接口,您将看到预期的结果。添加 IsFinal 解决了这个问题。
  • @TroelsLarsen:是的,这就是我所做的测试 :)
  • 这个条件(method.IsVirtual && !method.IsFinal)也满足属性(getter 和 setter 方法,如 get_PropertyName、set_PropertyName)
  • @ElanchezhianNarayanasamy:你是在问这个,还是在陈述它?我不知道你的评论有什么意义呢。
【解决方案2】:

完整的工作示例:

class Program
{
    static void Main(string[] args)
    {
        MethodInfo[] methods = typeof(User).GetMethods();
        foreach (var method in methods)
        {
            if (method.IsVirtual && !method.IsFinal)
            {
                Console.WriteLine(method.Name);
            }
        }
        Console.ReadLine();
    }
}

public class User : IUser
{
    public string Get(int id)
    {
        // some codes
        return null;
    }
    public virtual string GetData(int id)
    {
        // I want to find this method declared as virtual
        return null;
    }
}

public interface IUser
{
    string Get(int id);
    string GetData(int id);
}

输出:

GetData
ToString
Equals
GetHashCode

【讨论】:

  • 如果这对您有用,请标记其他答案。我只是粘贴它让 OP 运行。
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 2010-10-16
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2011-07-18
  • 1970-01-01
相关资源
最近更新 更多