我试图构建一个静态通用缓存,它将保存应用(事件 e)形式的几种方法的方法信息。RedirectToWhen 中使用了类似的代码,来自 CQRS Lokad 框架。
问题是通用缓存不考虑派生类(如果有的话)。这是一个显示不良行为的简单测试:
[TestMethod]
public void TestGenericsInheritance()
{
var sut = new DerivedFromAbstractType();
Utils.UsefulMethod<DerivedFromAbstractType>(sut);
Assert.AreEqual(10, sut.Value);
}
public abstract class AbstractType
{
public int Value { get; set; }
}
public class DerivedFromAbstractType : AbstractType
{
public void AnyOtherMethod()
{
Value = 10;
}
}
public static class Utils
{
public static void UsefulMethod<T>(T instance)
{
MethodInfo info = typeof(T)
.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Where(m => m.Name == "AnyOtherMethod")
.Where(m => m.GetParameters().Length == 0).FirstOrDefault();
info.Invoke(instance,null);
}
}
typeof(T) 返回 AbstractType,所以我不能用它来构建一个通用的静态缓存。我怎样才能为知道派生类型的方法获得通用缓存?