我们有一个项目,它使用拦截器对象来告诉NHibernate在保存entity.This拦截器之前做一些常规工作。do.Now有一个单一的任务,应该添加到这个拦截器中(NHibernate不支持多个拦截器),但是我不想让这个拦截器变得复杂,相反,我想使用组合模式来管理所有注册的interceptors.something:
public bool Onload(object entity,object id,object[] state,string propertyNames,IType[] types_
{
var result=false;
foreach(var interceptor in _registeredInterceptors)
result=result || interceptor.OnLoad(entity,id,state,propertyNames,types);
return result;
}
public bool OnFlushDirty(object entity,object id,object[] state,string propertyNames,IType[] types_
{
var result=false;
foreach(var interceptor in _registeredInterceptors)
result=result || interceptor.OnFlushDirty(entity,id,state,propertyNames,types);
return result;
}通过查看这段代码,我意识到可能有一种更好的方法来防止我重复自己。问题是,我能不能使用Lambda表达式和yield关键字让这段代码变得更简单和抽象?
发布于 2012-02-04 21:55:32
其中一种方法可能如下所示:
public bool Execute(IList<IInterceptor> interceptors, Func<IInterceptor, bool> func)
{
bool result = false;
foreach (IInterceptor interceptor in interceptors)
{
result = result || func(interceptor);
}
return result;
}在父拦截器中:
public bool Onload(object entity, object id, object[] state, string propertyNames, IType[] types_
{
return Execute(_registeredInterceptors, x => x.OnLoad(entity, id, state, propertyNames, types);
}
public bool OnFlushDirty(object entity, object id, object[] state, string propertyNames, IType[] types_
{
return Execute(_registeredInterceptors, x => x.OnFlushDirty(entity, id, state, propertyNames, types);
}更新
如果你想让结果类型是泛型的,你可以这样做:
public static T Execute<T>(IList<IInterceptor> interceptors, Func<IInterceptor, T> func)
{
T result = default(T);
foreach (IInterceptor interceptor in interceptors)
{
// your logic based on type T
}
return T;
}由于使用了Type inference,通用版本的执行看起来与bool版本完全相同。
这就是你所想的吗?
https://stackoverflow.com/questions/9126207
复制相似问题