如何检查类的所有公共方法是否为虚拟方法

时间:2013-01-16 12:37:28

标签: c# .net nunit nservicebus

在.net项目中,有很多实体在c#中实现。使用过的库(saser实体的nservicebus)的要求是所有访问方法都被声明为public和virtual,否则在部署过程中就会失效。

在单元测试阶段检查实体的访问方法是否为虚拟是合理的,s.a。部署可能需要很长时间(在它被发现之前)

有没有人知道检查类中的所有公共方法是否在nunit测试中声明为虚拟的好方法?

4 个答案:

答案 0 :(得分:3)

我使用相同的测试来验证,游戏引擎包装器将所有公共方法都视为虚拟。它使测试更容易,并可以大大减少反馈时间。这些方法我放在特殊的类DesignTests下,我在那里测试,例如,我的项目中没有违反约定。 FxCop无法检测到复杂的事情。您可以看到以下代码:

[Test]
public void AllPublicMethodsInUnityFacade_ShouldBeVirtual()
{
    var allPublicMethods = 
        typeof(UnityFacade).GetMethods(BindingFlags.DeclaredOnly |
                                       BindingFlags.Instance |
                                       BindingFlags.Public);

    Assert.IsTrue(allPublicMethods.All(method => method.IsVirtual),
                  string.Join(", ", allPublicMethods
                                        .Where(method => !method.IsVirtual)
                                        .Select(method => method.Name)) 
                                     + " is not virtual");

}

答案 1 :(得分:1)

使用反射,卢克。

http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.isvirtual.aspx

using System;
using System.Reflection;

public class MyClass 
{
    public void MyMethod() 
    {
    }
    public static void Main() 
    {
        MethodBase m = typeof(MyClass).GetMethod("MyMethod");
        Console.WriteLine("The IsFinal property value of MyMethod is {0}.", 
                          m.IsFinal);
        Console.WriteLine("The IsVirtual property value of MyMethod is {0}.",
                          m.IsVirtual);
    }
}

答案 2 :(得分:1)

您还可以使用像Fody/Virtuosity这样的工具为您完成这项工作:)

答案 3 :(得分:0)

public static void Main() 
{
    MethodInfo[] methodInfos = 
        typeof(MyClass).GetMethods(BindingFlags.Public 
                                   | BindingFlags.Instance 
                                   | BindingFlags.DeclaredOnly);

    Console.WriteLine("The number of public methods is: {0}", 
                      methodInfos.Length);

    Int32 virtualCount = 0;

    foreach (MethodInfo methodInfo in methodInfos)
    {
        if (methodInfo.IsVirtual)
            ++virtualCount;
    }

    if (virtualCount == methods.Length)
        Console.WriteLine("All the methods are virtual!");
    else
        Console.WriteLine("Only {0}/{1} methods are virtual!", 
                          virtualCount, methods.Length);    
}