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 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 回答