如何使用反射找到c#中声明为虚的所有方法

本文关键字:有方法 声明 反射 何使用 | 更新日期: 2023-09-27 18:15:49

例如

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

如何使用反射找到c#中声明为虚的所有方法

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

如果你真的想要"可以被覆盖的方法",你还需要检查MethodBase.IsFinal。所以把你的循环改成:

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

完整的工作示例:

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