繁体   English   中英

访问已分配给传入的Func <>参数的方法

[英]Accessing a method which was assigned to a passed in Func<> parameter

看起来我错过了一些显而易见的事情,但实际上无法弄清为什么我不能使用/访问分配给Func<>参数的方法,我想在外部调用上下文中访问/调用它。

在简单示例下面:(实际results数据类型不是string而是某种复杂类型)

class Caller
{
    private Func<string> factory;

    public Caller()
    {
        this.factory = null;
        var adapter = new Adapter(this.factory);
        adapter.Adapt(...);

        // then I would share this factory via IoC
        dependencyContainer.RegisterUsingFactoryMethod<string>(this.factory);

        // !!! but here is factory still not assigned
        string results = this.factory();
    }
}

class Adapter
{
    private string results;

    public Adapter(Func<string> factory)
    {
        factory = () => this.results;
    }

    public IOut Adapt(IIn input)
    {
       this.results = someCalculatedData;
    }
}

这与委托无关,而与所有参数默认情况下都按值传递的事实无关。 如果factoryintstringStringBuilder ,则会看到相同的行为。

如果希望Service构造函数修改参数的值,则需要refout参数。 但是,我个人建议您将其更改为使用返回 Func<string>

public class Caller
{
    private readonly Func<string> factory;

    public Caller()
    {
        this.factory = Service.GetFunc();
    }
}

public class Service
{
    public static Func<string> GetFunc()
    {
        return () => Guid.NewGuid().ToString();
    }
}

(这里还有许多其他选项,例如方法组转换或属性。当我们没有太多上下文时,很难知道该推荐什么。)

显然,您想重命名该方法。 但是仅调用构造函数来修改out参数将是非常奇怪的代码。

有关参数传递的更多信息,请参阅有关该主题的文章

您可以尝试将带有out参数的func粘贴到Service的构造函数吗?

例如

class Caller
{
    private Func<string> factory;

    public Caller()
    {
        this.factory = null;
        var service = new Service(out this.factory);

        // !!! but here is factory still not assigned
        string results = this.factory();
    }
}

class Service
{
    public Service(out Func<string> factory)
    {
        factory = () => Guid.NewGuid().ToString();
    }
}

这将确保编译器知道在Service构造函数中初始化对工厂参数的引用。 否则,您只是通过值将对null Func的引用传递给构造函数,然后在ctor内部的堆栈上将该函数局部分配给该变量。

请参阅此相关问题,以更清楚地了解ref和out参数。

最好的祝福,

您永远不会在被调用方分配工厂,

由于您没有通过引用将工厂传递给服务,因此调用者将看不到变量的更新。

我不确定是否可以通过引用将参数传递给构造器...

要调用Func<T...>引用,只需要像调用普通方法一样进行调用。 即:

class Service
{
    public Service(Func<string> factory)
    {
        string result = factory();
    }
}

请注意, Func<string>将返回string类型。

编辑

从您的评论中,我已经意识到您在OP中的实际要求。 为了能够为任何参数分配值,您需要使用outref对其进行标记。 因此,您的声明将如下所示:

public Service(out Func<string> factory)

要么

public Service(ref Func<string> factory)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM