Ho il seguente codice in un test di unitàReflection dice che il metodo di interfaccia è virtuale nel tipo implementato, quando non lo sono?
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;
}
che io chiamo da
Assert.IsTrue(TestMethodsOf<MyView, IMyView>());
voglio assicurare che tutti i metodi dall'interfaccia sono dichiarate come virtuali. Il motivo è perché sto applicando un aspetto di spring.net e si applicherà solo ai metodi virtuali.
Il problema che sto avendo è che implMember.IsVirtual è sempre vero, anche quando non sono dichiarati come tali nel tipo di dichiarazione.
Cosa c'è di sbagliato nella mia logica TestMethodsOf?
Acclamazioni
eccellente! Così ho cambiato il mio codice per verificare IsFinal invece di IsVirtual e ora funziona correttamente. Grazie! –