Передача параметра в метод, возвращающий Func - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующие данные c class

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()
        {

        }
    }

Что мне нужно сделать, это передать параметр в метод "DoX" через метод "ConvertDetail", поэтому метод "DoX" создает logi c основывается на полученном параметре

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)
        {

        }
    }

Проблема в полях c readonly !!!

1 Ответ

0 голосов
/ 03 мая 2020

Еще раз взглянем на синтаксис определения Func<>:

https://docs.microsoft.com/en-us/dotnet/api/system.func-2

https://docs.microsoft.com/en-us/dotnet/api/system.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() метод фактически примет эту подпись - обновление Fun c не означает, что предоставленный вами делегат внезапно узнает, что делать с дополнительным параметром, если он этого еще не ожидал.

...