【问题标题】:Using Action<T> delegate with a class having parameterized constructor将 Action<T> 委托与具有参数化构造函数的类一起使用
【发布时间】:2019-05-21 06:26:58
【问题描述】:

我有一个 Caller 类,它有一个默认构造函数和其他用于注入依赖项的参数化构造函数。

Helper 类的一个地方,我有一个名为DoSomething 的方法,它需要Action&lt;T&gt;,其中T 的类型是Caller

当需要使用参数化构造函数创建Caller 的实例以便在其中注入依赖项时,我如何将Caller 的实例作为参数传递给Action 委托 ?

注意:编写代码只是为了让问题易于理解。

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"; }); 
    }
}

【问题讨论】:

  • 我不明白您为什么要将带有 Action 委托的方法带入其中,听起来您的整个问题都是关于这个 Caller 类和构造函数的?如果委托需要调用者的实例,那么在谈论委托时你如何构造调用者有什么关系呢?你能澄清一下你的问题到底是关于什么的吗?
  • 这里的问题是该方法需要提供它自己的 Caller 实例,而不是你在外面拥有的东西。你能提供一些关于“执行必要的东西”正在做什么的细节吗?它从哪里获得Caller 实例?还是这个问题?如何获取外部Caller 实例并使其在DoSomething 方法中可用?简而言之,你把它传进去。这个设计对我来说似乎很奇怪。
  • 你完全可以 Helper.DoSomething((ignore_me ) =&gt; { c2.CallerName = "Test Again"; });... 但这与显示的其余代码相比非常奇怪 - 如果你打算这样使用它,你为什么还要拥有 Action&lt;T&gt;

标签: c# .net lambda delegates


【解决方案1】:

如果您想以这种方式创建自定义 Caller 实例,我不确定是否可以使用 lambda 表达式。但是,您可以使用返回Action&lt;Caller&gt; 的方法:

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

并将具有依赖关系的调用者传递给该方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2020-02-21
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多