我有以下静态类
public static partial class ClassX
{
private static readonly Expression<Func<Customer, CustomerDetail>> _exp = DoX();
private static readonly Func<Customer, CustomerDetail> _comp = DoX().Compile();
static ClassX() { }
public static IQueryable<CustomerDetail> ConvertDetail(this IQueryable<Customer> query)
{
query.Select(_exp);
}
public static CODEDistrictDTO ConvertDetail(this Customer customer)
{
return _comp(customer);
}
private static Expression<Func<CODEDistrictEntity, CODEDistrictDTO>> DoX()
{
}
}
我需要做的是通过 "ConvertDetail "方法向 "DoX "方法传递一个参数,让 "DoX "方法在接收到的参数基础上建立逻辑。
public static partial class ClassX
{
private static readonly Expression<Func<Customer, CustomerDetail>> _exp = DoX(); //problem
private static readonly Func<Customer, CustomerDetail> _comp = DoX().Compile(); //problem
static ClassX() { }
public static IQueryable<CustomerDetail> ConvertDetail(this IQueryable<Customer> query, List<int> mlist)
{
query.Select(_exp(mlist));
}
public static CODEDistrictDTO ConvertDetail(this Customer customer, List<int> mlist)
{
return _comp(customer,mlist);
}
private static Expression<Func<CODEDistrictEntity, CODEDistrictDTO>> DoX(List<int> mlist)
{
}
}
问题在静态readonly字段!!!
再来看看一个语法是怎样的。Func<>
被定义。
https:/docs.microsoft.comen-usdotnetapisystem.func-2。
https:/docs.microsoft.comen-usdotnetapisystem.func-3。
public delegate TResult Func<in T,out TResult>(T arg);
public delegate TResult Func<in T1,in T2,out TResult>(T1 arg1, T2 arg2);
您在顶部应用的定义为 Func<Customer, CustomerDetail>
那么就意味着你提供了一个委托函数,该函数接收一个类型为 Customer
并返回一个类型为 CustomerDetail
. 下面这个代码块调用委托函数 _comp
随着 customer
值作为该参数。
public static CODEDistrictDTO ConvertDetail(this Customer customer)
{
return _comp(customer); // <- Calls our delegate Func<Customer,CustomerDetail> with a Customer param, returns a CustomerDetail
}
在您更新的代码中,您突然开始尝试将两个参数传递给那个委托函数,并用 _comp(customer,mlist)
,但它只被定义为有一个参数。将委托人改为期待两个参数,第二个参数的类型为 List<int>
,那么你就需要将其更新为 private static readonly Func<Customer, List<int>, CustomerDetail> _comp = ...
请记住,只有在你的 "你的",这才会对你有所帮助。DoX.Compile()
方法实际上会接受这个签名--更新Func并不意味着你提供的委托人会突然知道如何处理额外的参数,如果它还没有期待它的话。