Ошибка аргумента при передаче делегата Action в качестве параметра конструктору - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь передать делегат действия в конструктор, но получаю следующее сообщение об ошибке:

Делегат 'действие' не принимает 0 аргументов

Код:

public sealed class VariantProcessor
{
    private string _myAppConnectionString { get; set; }
    private readonly Action<Variant> _transform;
    public Variant(string _myAppConnectionString,Action<Variant> transform)
    {
         _myAppConnectionString = _myAppConnectionString;
         _transform = transform;
    }
    public void Process(Variant model)
    {
        try
        {
            _transform(model);
             //version creation shared by both the derived types
        }
        catch (Exception) 
        {
        }
    }
}

public class AggregateCalculator : IVariantProcessor
{
    private string _myAppConnectionString { get; set; }
     public void Process(Variant model)
     {
            _myAppConnectionString = ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString;
            new VariantProcessor( _myAppConnectionString,
               () => Transform(model) //error
               );
     }
    private void Transform(Variant model)
    {
        //logic on variant model
    }
}

Я тоже так пытался, но все равно не повезло:

new VariantProcessor(_myAppConnectionString,
                   Transform(model) // error
                    );

На самом деле у меня проблемы с пониманием этого синтаксиса () => Transform(model), следовательно, я не понимаю, в чем проблемаздесь.

Может кто-нибудь помочь мне разобраться в чем здесь проблема?

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Action, который принимает ваш конструктор, это Action<Variant>, что означает, что это фрагмент кода, который принимает один параметр типа Variant и возвращает void (потому что Action ничего не возвращает.

Когда вы вызываете конструктор, вы можете передать ему лямбду, которая принимает один параметр, подобный этому:

new VariantProcessor(_myAppConnectionString, model => Transform(model));

или вы можете передать ему имя функции, которая принимает Variant и возвращает void:

new VariantProcessor(_myAppConnectionString, Transform);

Синтаксис:

() => Transform(model)

означает лямбду, которая принимает нулевые параметры (то есть ()). Вам нужно указать лямбду, которая принимает один параметр. Вы можете написать это как:

model => Transform(model)

или

(model) => Transform(model)

Если у вас есть лямбда, которая принимает более одного параметра, вы должны заключить их в квадратные скобки.

1 голос
/ 16 мая 2019

Попробуйте использовать следующий код. Вам необходимо передать аргумент в лемду

public class AggregateCalculator : IVariantProcessor
{
    private string _myAppConnectionString { get; set; }
     public void Process(Variant model)
     {
            _myAppConnectionString = ConfigurationManager.ConnectionStrings["dbConnectionString"].ConnectionString;
            new VariantProcessor( _myAppConnectionString,
               (o) => Transform(model)
               );
     }
    private void Transform(Variant model)
    {
        //logic on variant model
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...