我有一个泛型基类的方法我想对它的所有超类执行这个方法
逻辑类似于:
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;
})
};
}