0

我试图构建一个静态通用缓存,它将保存应用(事件 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,所以我不能用它来构建一个通用的静态缓存。我怎样才能为知道派生类型的方法获得通用缓存?

4

2 回答 2

0

利用

instance.GetType()

如果实例不为空且 typeof(T) os 实例为空。

于 2015-01-13T13:15:52.610 回答
0

我知道这有点坏死,但我遇到了同样的问题,typeof(T) 返回基本类型。这在想要创建实现 Emit/Apply 模式的 BaseAggregate 时很有用。我这样解决了:

 private static class Cache
        {
            private static readonly IDictionary<Type, IDictionary<Type, MethodInfo>> _dict =
                new Dictionary<Type, IDictionary<Type, MethodInfo>>();

            public static IDictionary<Type, MethodInfo> GetDictionaryForType(Type type)
            {
                if (_dict.ContainsKey(type))
                {
                    return _dict[type];
                }
                var dict = type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                    .Where(m => m.Name == "When")
                    .Where(m => m.GetParameters().Length == 1)
                    .ToDictionary(m => m.GetParameters().First().ParameterType, m => m);
                _dict.Add(type, dict);
                return dict;
            }
        }

这仍然很好地缓存,并object.GetType()返回要输入此方法的正确类型。

于 2016-04-10T19:08:08.413 回答