2012-02-23 5 views
0

I持って働く次の擬似コード:代理人に引数を渡すにはどうすればよいですか?

KeyBindings[Keys.Right] += Method1; 
KeyBindings[Keys.Right] += Method2; 

私はこれを行うことができるようしたいと私はあるに実行している問題:

KeyBindings[Keys.Right] += Method1(argument); 
KeyBindings[Keys.Right] += Method2(argument1, argument 2); 

これは可能ですか?もしそうなら、これを達成するために私のコードを書き直すにはどうしたらいいですか?それはそのように動作しません

Dictionary<Keys, Action> KeyBindings = new Dictionary<Keys, Action>(); 
+3

「KeyBindings」とは何ですか?代議員の辞書? –

+0

@JeffMercado:編集してください。 – Kittoes0124

答えて

3
class Program { 
    public static void Main() { 
     Dictionary<ConsoleKey, Action> KeyBindings = new Dictionary<ConsoleKey, Action>(); 
     KeyBindings[ConsoleKey.A] = null; 
     KeyBindings[ConsoleKey.A] +=() => Method1(12); 
    } 

    static void Method1(int arg) { 
    } 
} 
+0

そのことについて申し訳ありませんが、私はそのコメントを書いた後までKittoesのアップデートを見ていません。コンパイラはラムダがどのような型かを推論することができます。 –

+0

それは動作する - 上記を参照してください –

+0

@ドミトリーノーギン:私はこれに以前コメントしてみましたが、それはもはや存在しないと私はかなり悲しかったと述べた。これは完璧に機能しましたが、私の問題は私がなぜそれを理解していないかということです。私は本当にC#のラムダ式を拾うことができる強固なリンクを持っていますか? – Kittoes0124

0


キーバインドは以下のように定義されます。あなたはこの時点でメソッドを呼び出すのではありません。単に、どのメソッドを使うべきかを伝えるだけです。

イベントを作成するときは、パラメータを含むどのような方法を指定します。パラメータは、イベントが発生した場所で渡されます。ここで

は、あなたがよりよく理解するのに役立ちますトピックに関連するチュートリアルです: 以下のコードを見てみるとhttp://www.csharp-station.com/Tutorials/lesson14.aspx

はまた、あなたが少し良く一緒に作品を置くに役立つことがあります。あなたは、あなたが思った道をやりたいと思ったものを達成することができないように見える場合

public void SomeMethod() 
{ 
    //Assign the delegate 
    KeyBindings[Keys.Right] += Method1; 
} 

public PlaceWhereEventGetsRaised() 
{ 
    object argument1, argument2; 

    // set the arguments to something 

    if (KeyBindings[Keys.Right] != null) 
     KeyBindings[Keys.Right](argument1, argument2); 
} 

public void Method1(object argument1, object argument2) 
{ 
    // Do stuff 
} 

、その後、私たちはあなたが何をしようとしている、多分私達はあなたが右のアプローチを見つけるのを助けることができるものを知ってみましょう。一般的にはまあ

+0

私はこの間ずっと運がなかったので、私はそれを恐れていました。私が望む機能を得るためにこれを書き直す方法はありますか? – Kittoes0124

+0

お探しの機能が何をすべきか説明できますか?あなたの実際の問題についてより具体的にすることができます。 –

+0

申し訳ありません。既知の変数に既知の関数を渡そうとしています。私はMove()やAnimate()のような静的なクラスの関数を持っています。現在の実装では、イベントが発生した場所でこれらのパラメータを渡す必要がありますが、それは意味をなさないだけです。 – Kittoes0124

3

あなたには、いくつかの既存の機能を取り、引数の設定セットを適用するデリゲートを作成したい場合、あなたは別の内部の機能をラップする必要があります。例えば

1つのstringの引数を取り、返す関数Foo()を考えてみましょう(Func<string, int>と同じシグネチャを持つ)int:あなたがデリゲートを作成するためにこれを使用したい場合は

int Foo(string str) 
{ 
    return str.Length + 8941; 
} 

こと文字列"bar"Fooを呼び出した結果を返します。

Func<int> foobar =() => Foo("bar"); 

新しい代理人であるラムダ式を作成し、何も取らず、この場合はFoo("bar")を呼び出した結果を返すことに注意してください。


あなたは、あなたのコード内で同じことを適用することができます。

KeyBindings[Keys.Right] += new Action(() => Method1(argument)); 
KeyBindings[Keys.Right] += new Action(() => Method2(argument1, argument 2)); 
+0

** KeyBindings [Keys.Right] + =()=> Actions.MoveRight (arg1、arg2); **は完全に機能します。私はそれを提案した最初の男にコメントしていたが、彼は彼の答えを取り除いたようだ。 – Kittoes0124

+0

興味深い.... –

+0

@Kittoes:ええ、私たちがここでどのようなタイプを扱っていたのかわからなかったので、それがうまくいくかどうかは分かりませんでした。しかし、あなたがそれを追加して以来、それはまさにそのように働くでしょう。あなたが最初に示したものに基づいて、 'Method1()'と 'Method2()'は異なるタイプであったため、辞書は 'Action'のような特定の型ではなく' Delegate'を格納しなければなりませんでした。 –

0

あなたは内部固定、それらの引数を持つ新しいメソッドを作成する必要があり、そのようなことをします。または次のような匿名メソッド:

event += (s, someEventArgs) => Method1(s, someEventArgs, someOtherArgs) 
関連する問題