2012-05-11 8 views
2

のは、私がデリゲートを持っているとしましょうどのようなタイプまたは引数の数がわからない場合は...デリゲートメソッド - 私は

public delegate void MyAction(params object[] args); 

そして、それdelagateを使用してサブクラスを持つクラスを呼び出し、引数を渡す方法...

public class MyClass { 
    public List<MySubClass> mySubClasses; 
} 

public class MySubClass { 
    public string myString; 
    public MyAction myDelegateMethod; 
} 

私は、実行時に、様々な種類の任意の数の引数を受け入れることができた、myDelegateMethodに任意の方法を渡すことができるようにしたいです。これのようなもの...

実行時にこれらのメソッドをそれぞれどのように呼び出すのですか?

myClass.mySubClasses.ForEach(x => { 
    x.myDelegateMethod; // <-- this is where I'm stumped. how do i pass arguments here? 
}); 

これは可能ですか?おそらく私は何かが間違って実装されている? Method1Method2void <Name> (params object)代表者ではありませんので、

+0

あなたが渡す議論は何ですか? –

+0

@KirkWoll Method1(myObject)とMethod2( "abc"、myGuid) – bflemi3

+0

私が間違っている場合は私を修正しますが、それはテストデータのようです。私はあなたが実際に他の場所で得られた引数を実際の引数に渡したいと思っていました。もしそうなら、私は、潜在的なパラメータの任意の数を考えれば、それをどのように管理するのか不思議です。 (それを呼び出すことの難しさを除いて) –

答えて

2

これは、不可能です。それらは異なる値を返し、実行するために異なるパラメータを取ることを考慮すると、同じタイプ(または互換性のあるタイプへの分散を伴うコンバーチブル)ではありません。

あなたは、任意のメソッドを実行したい場合は、その後、私は考えることができる唯一の方法は、アクションとして包まれたメソッドの実行を取るために、次のようになります。

var sample = new List<MyClass> 
{ 
    new MyClass 
    { 
     SomeProperty = "Help", 
     Method = new Action(() => 
      { 
       ExecuteMethod1("Hello", "World"); 
      }) 
    }, 
    new MyClass 
    { 
     SomeProperty = "Me", 
     Method = new Action(() => 
      { 
       ExecuteMethod2(1, 2, 3, 4); 
      }) 
    }, 
}; 

そして、あなたはそのように実行することができる:

myClass.ForEach(x => x.Method()); 

このような状況では、(作成時に知られているパラメータを使用して)何をしたいのかを明示的にラップする必要があります。Methodです。

+0

あなたは 'Delegate.DynamicInvoke'に精通していませんか? ? –

+0

もちろんそれは可能ですが、私の印象では、OPは強く型付けされたデリゲートハンドラを必要としていました。 – Tejs

+0

しかし、あなたが実際に 'myClass.ForEach(x => x.Method());と呼ぶまで引数の値が何になるのかわからないなら、あなたはどうしますか? – bflemi3

0

まず、Method2を代理人として使用することはできません。そうすることも良い習慣ではありません。あなたは反射でそれをやろうとすることはできますが、あなたのコードを読む人はほとんど理解できません。

public void Method1(params object[] pars) 
{ 
    string value = (string)pars[0]; 
    Guid id = (Guid)pars[1]; 
} 

または前の回答からクロージャのいくつかの並べ替えを使用します。 だから、私はあなたがタイプを委任が、このように、メソッド内の型を必要とするキャストのようなすべてのメソッドを使用する必要があり、だと思います。

+0

これと上記の答えは問題の要点あなたの代理人は 'void(params object [] pars)'の形式を持たないので、デリゲートの定義と一致しません。この回答のトリックを使用する方法は、各メソッドが異なるパラメーター引数を利用する方法です。ただし、有効な引数がないかどうかを確認してください。そうしないと、問題が深刻化します。 – SPFiredrake

関連する問題