例如
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
答案 0 :(得分:4)
问题是Get
是一个虚拟方法,因为它实现了IUser.Get
,所以使用执行时调度来调用 - 我怀疑,无论如何。 (你没有给我们一个完整的程序,所以我不得不猜测。)
如果您确实想要“可以覆盖的方法”,您还需要检查MethodBase.IsFinal
。所以只需将你的循环改为:
foreach (MethodInfo method in methods)
{
if (method.IsVirtual && !method.IsFinal)
{
Console.WriteLine(method.Name);
}
}
答案 1 :(得分:1)
完整的工作样本:
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