gpt4 book ai didi

c# - 在 C# 中将 Func 转换为 Func

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:02 25 4
gpt4 key购买 nike

如何转换 Func<DepartmentViewModel, bool>Func<Department, bool>

我看过很多关于这个问题的帖子,但没有一个能帮助我。

我调用这个函数:

public DepartmentViewModel GetSingle(Expression<Func<DepartmentViewModel, bool>> whereCondition)

像这样从 GUI 层:

_departmentService.GetSingle(de => de.Id ==id));

内部GetSingle位于我必须调用的业务层中的函数

public IEnumerable<Department> GetAll(Func<Department, bool> predicate = null)

但是GetAll函数接受 Func<Department, bool>输入

这是我的对象:

class Department {
public string name
}

class DepartmentViewModel{
public string name
}

再见,我找到了最佳答案: Func<DepartmentViewModel, bool> some_function = whereCondition.Compile(); Func<Department, bool> converted = d => some_function(
new DepartmentViewModel {
Id=d.Id,
Description=d.Descriptions
}
);

最佳答案

您无法更改 Func<T1,bool>Func<T2,bool> , 但您可以转换相同的表达式。

这需要一些工作,首先你必须通过 Expression<Func<T,bool>> , 然后您可以轻松转换表达式以匹配传入参数。

所以你可以改变你的方法,

Expression<Func<DepartmentViewModel,bool>> srcLambda = 
x => x.DepartmentName.StartsWith("Admin")

Expression<Func<Department,bool>> destLambda =
ConvertTo<Department,DepartmentViewModel>( srcLambda);

这假设 DepartmentViewModel (DTO) 具有与 Department 相同的字段。否则,您将不得不稍微更改代码以满足您的需要。

public static Expression<Func<TDest,bool>> 
ConvertTo<TSrc,TDest>(Expression<Func<TSrc,bool>> srcExp)
{
ParameterExpression destPE = Expression.Parameter(typeof(TDest));

ExpressionConverter ec = new ExpressionConverter(typeof(TSrc),destPE);
Expression body = ec.Visit(srcExp.Body);
return Expression.Lambda<Func<TDest,bool>>(body,destPE);
}

public class ExpressionConverter: ExpressionVisitor{

private Type srcType;
private ParameterExpression destParameter;

public ExpressionConverter(Type src, ParameterExpression dest){
this.srcType = src;
this.destParameter= dest;
}

protected override Expression
VisitParameter(ParameterExpression node)
{
if(node.Type == srcType)
return this.destParameter;
return base.VisitParameter(node);
}
}

关于c# - 在 C# 中将 Func<T1,bool> 转换为 Func<T2,bool>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32284669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com