簡體   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