Использование Action <T>делегата с классом, имеющим параметризованный конструктор - PullRequest
1 голос
/ 21 мая 2019

У меня есть класс Caller с одним конструктором по умолчанию и другим параметризованным конструктором, который я использую для внедрения зависимостей.

В одном месте класса Helper у меня есть метод с именем DoSomething, который ожидает Action<T>, где T имеет тип Caller.

Как передать экземпляр Caller в качестве аргумента делегату Action, когда необходимо создать экземпляр Caller с помощью параметризованного конструктора, чтобы в него была вставлена ​​зависимость ?

Примечание: код написан только для того, чтобы сделать вопрос понятным.

public class Caller
{
    private IServiceProvider _serviceProvider;

    public string CallerName { get; set; }
    public Caller()
    {
        // Do some initializations
    }

    public Caller(IServiceProvider serviceProvider) : this()
    {
        // Service Provider is injected to get some dependencies resolved later in the code.
        _serviceProvider = serviceProvider;
    }
}

public static class Helper
{
    public static void DoSomething(Action<Caller> actOnCaller)
    {
      // Perform necessary stuff
    }
}

public class Consumer
{
    public Consumer()
    {
        // This works
        Helper.DoSomething(c => { c.CallerName = "Test"; });

        // How to pass an instance of Caller which I want with dependencies?
        IServiceProvider serviceProvider = new MyServiceProvider(); 
        var c2 = new Caller(serviceProvider);
        // This does not work because of the scope of caller variable. I tried to "new-up" the Caller instance directly in lambda but that too didnt help.
        Helper.DoSomething((c2 ) => { c2.CallerName = "Test Again"; }); 
    }
}

1 Ответ

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

Я не уверен, что вы можете использовать лямбда-выражение, если вы хотите создать собственный экземпляр Caller таким образом.Однако вы можете использовать метод, который возвращает Action<Caller>:

public static Action<Caller> GetCallerAction(Caller caller)
{
  return delegate { caller.CallerName = "Test Again"; };
}

и передать Caller с зависимостями в этот метод:

IServiceProvider serviceProvider = new MyServiceProvider(); 
var c2 = new Caller(serviceProvider);
Helper.DoSomething(GetCallerAction(c2));
...