如何检测自上次编译以来方法是否已更改?

时间:2018-10-01 12:52:59

标签: c# reflection

我有一个要求,我想检查我的方法主体是否在运行时更改。这是专门针对使用单元的测试用例。我有要保存在数据库中的测试步骤。但是大多数情况下,此步骤不会更改,因此,不想每次运行时都将其保存到数据库中而使数据库过载。如果添加或修改了新步骤,我只想保存新步骤。

例如

[Test]
 public void Should_Pass_When_SomethingHappened()
      {
        File.Open(TestFile);      //step 1
        File.Close()   //step2 
     }

现在,如果有人将这种方法更改为在下面说

[Test]
 public void Should_Pass_When_SomethingHappened()
      {
        File.Open(TestFile); //step1 
        File.Copy(Source, Desitnation); //step2      
        File.Close(); //step 3
     }

我想在运行测试时在测试中捕获此更改。这样,我可以在数据库中标记此测试用例已更改,并避免在保留原始步骤的同时在数据库中添加新步骤。

我尝试过:

public int CheckIfMethodIfModified()
{
   Type TestType = typeof(MyTypeName);
   MethodInfo myMethodInfo = 
   TestType.GetMethod("Should_Pass_When_SomethingHappened");
   MethodBody mb = myMethodInfo.GetMethodBody();
   string result = System.Text.Encoding.UTF8.GetString(mb.GetILAsByteArray());
   result.GetHashCode();
}

即使我的方法已更改,此哈希码也不会更改。

1 个答案:

答案 0 :(得分:1)

GetHashCode被专门记录为在应用程序的不同执行中作为哈希方法不可靠。它仅被设计为在单个应用程序的一次执行期间用作基于哈希的数据结构中的键,而没有其他用途。

如果要创建在应用程序执行期间保持一致的哈希,则需要使用其他方法。例如,可以使用多种加密哈希,这些哈希在给定相同输入的情况下会始终产生相同的哈希。