1

明らかな何かを見逃しているように見えますが、渡されたパラメーターに割り当てられたメソッドを使用/アクセスできない理由を本当に理解できません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;
    }
}
4

4 に答える 4

4

これはデリゲートとは関係なく、すべての引数がデフォルトで値渡しされるという事実に関係しています。、または 、または の場合、同じ動作が見られfactoryます。intstringStringBuilder

Serviceコンストラクターで引数の値を変更する場合は、またはrefパラメーターoutが必要です。ただし、個人的には、を返すメソッドを使用するように変更することをお勧めします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と、非常に奇妙なコードになります。

パラメーターの受け渡しの詳細については、トピックに関する私の記事を参照してください。

于 2012-01-17T11:59:27.640 に答える
3

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 コンストラクターの factory パラメーターへの参照を初期化することをコンパイラーが認識できるようになります。それ以外の場合は、null Func への参照をコンストラクターに値で渡し、関数を ctor 内のスタック上のその変数にローカルに割り当てます。

ref および out パラメータを明確にするために、この関連する質問を参照してください。

よろしくお願いします、

于 2012-01-17T11:57:25.377 に答える
2

呼び出し先のファクトリに割り当てることはありません。

ファクトリを参照によってサービスに渡さないため、変数への更新は呼び出し元には表示されません。

参照によってコンストラクターにパラメーターを渡すことができるかどうかはわかりません...

于 2012-01-17T11:54:01.313 に答える
0

参照を呼び出すFunc<T...>には、通常のメソッドであるかのように呼び出す必要があります。すなわち:

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

タイプFunc<string>を返すことに注意してください。string

編集

あなたのコメントから、OPで実際に何を求めていたのかがわかりました。out任意のパラメータに値を割り当てることができるようにするには、またはでマークする必要がありますref。したがって、宣言は次のようになります。

public Service(out Func<string> factory)

また

public Service(ref Func<string> factory)
于 2012-01-17T11:54:39.637 に答える