2

代理人がいるとしましょう...

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

そして、その遅延を使用するサブクラスを持つクラス...

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

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

myDelegateMethod実行時に、さまざまな型の引数をいくつでも受け入れることができる、に任意のメソッドを渡すことができるようにしたいと思います。このようなもの...

MyClass myClass = new MyClass(){
    mySubClasses = {
        new MySubClass {
            myString = "help",
            myDelegateMethod = Method1 
        },
        new MySubClass {
            myString = "me",
            myDelegateMethod = Method2 
        }
    }   
};

public string Method1(object myObject) { ... }
public string Method2(string value, Guid id) { ... }

実行時にこれらの各メソッドを呼び出して、適切な引数を渡すにはどうすればよいですか?

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

これは可能ですか?おそらく私は何かが間違って実装されていますか?

4

2 に答える 2

2

Method1とは代理人でMethod2はないため、これは不可能です。void <Name> (params object)それらは、異なる値を返し、実行するために異なるパラメーターを使用することを考えると、同じタイプではありません(または、互換性のあるタイプに分散して変換可能です)。

任意のメソッドを実行したい場合、私が考えることができる唯一の方法は、ラップされたメソッドの実行をアクションとして実行することです。

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

于 2012-05-11T15:35:08.083 に答える
0

まず、Method2をデリゲートとして使用することはできません。また、そうすることは良い習慣ではありません。リフレクションを使ってそれを試みることはできますが、コードを読む他の人にはほとんど理解できません。したがって、型を委任するのと同じようにすべてのメソッドを使用する必要がありますが、次のようにメソッド内で型が必要になるようにキャストする必要があります。

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

または、前の回答からのある種のクロージャを使用します。

于 2012-05-11T15:38:07.097 に答える