什么结构我在寻找Lamba /表达式/函数/反射运行时属性替换



我有一个泛型基类的方法我想对它的所有超类执行这个方法

逻辑类似于:

BuildAverageDateStats(List<type> items, DateProperty1 exp, DateProperty2 exp2)
{
 return new Stat{ 
  Value = items.Average(c => (c.DateProperty2 - c.DateProperty1).Milliseconds)
 };
}
myobject.BuildAverageDateStats(list, () => c.QueuedDate, () => c.CompletedDate);
myobject.BuildAverageDateStats(list, () => c.ActionedDate, () => c.CompletedDate);

我想我需要表达式,但不确定如何…

我可以发送它作为函数,即Value = items.Average(c => myfunc(c)),但寻找一个属性替代的例子。

Stat BuildAverageDateStats<U>(List<type> items, Func<U, double> exp)
where U:type
{
 return new Stat{ 
  Value = items.OfType<U>().Average(exp);
 };
}

你可以这样命名

BuidlAverageDateStats<Dog>(items, d=>d.Age - d.Height);

如果你真的只打算使用你现在拥有的三个DateTime属性中的一个,我会保持你现在拥有的方法签名。为了使事情更简洁,在你的类上为你的属性创建一些公共的静态只读委托字段,并使用它们,而不是一次又一次地编写相同的表达式:

    public static readonly DateSelector Date1Property = delegate(CompareTest c) { return c.Date1; };
    public static readonly DateSelector Date2Property = delegate(CompareTest c) { return c.Date2; };
    public static readonly DateSelector Date3Property = delegate(CompareTest c) { return c.Date3; };

另一方面,如果您希望继承的类实现比现在的三个属性更多的属性,您可以考虑将这些属性作为String传入,并使用Dynamic Linq Library(并构建一个返回属性的动态表达式)或DynamicMethod来返回您的属性。两者都有反思痛苦表现的好处。如果你需要它,我有一些代码。类型安全将被排除在外,所以除非必要,否则我不会使用它,听起来好像不是。

Menno

static Stat BuildAverageDateStats<T>(List<T> items, string pname1, string pname2){
    return new Stat { 
        Value = items.Average( c => 
        {
            var ty = c.GetType();
            var pv1 = (dynamic)ty.GetProperty(pname1).GetValue(c,null);
            var pv2 = (dynamic)ty.GetProperty(pname2).GetValue(c,null);
            return pv2 - pv1;
        })
    };
}

最新更新