Отражение говорит, что методы интерфейса являются виртуальными в реализованном типе, когда это не так?

У меня есть следующий код в модульном тесте

    public bool TestMethodsOf<T, I>()
  {
   var impl = typeof(T);
   var valid = true;

   foreach (var iface in impl.GetInterfaces().Where(i => typeof(I).IsAssignableFrom(i)))
   {

    var members = iface.GetMethods();

    foreach (var member in members)
    {
     Trace.Write("Checking if method " + iface.Name + "." + member.Name + " is virtual...");
     var implMember = impl.GetMethod(member.Name, member.GetParameters().Select(c => c.ParameterType).ToArray());
     if (!implMember.IsVirtual)
     {
      Trace.WriteLine(string.Format("FAILED"));
      valid = false;
      continue;
     }

     Trace.WriteLine(string.Format("OK"));
    }
   }
   return valid;
  }

, который я вызываю с помощью

Assert.IsTrue(TestMethodsOf<MyView, IMyView>());

). Я хочу убедиться, что все методы из интерфейс объявлен как виртуальный. Причина в том, что я применяю аспект spring.net, и он будет применяться только к виртуальным методам.

Моя проблема заключается в том, что implMember.IsVirtual всегда истинно, даже если они не объявлены как таковые в объявляющем типе.

Что не так с моей логикой TestMethodsOf?

Ура

12
задан Tim Cooper 25 January 2011 в 12:01
поделиться