委托方法 - 如果我不知道什么类型或多少参数,如何调用和传递参数

本文关键字:参数 何调用 调用 如果 方法 我不知道 什么 多少 类型 | 更新日期: 2023-09-27 18:33:49

假设我有一个代表...

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?
});

这可能吗?也许我实施错误了什么?

委托方法 - 如果我不知道什么类型或多少参数,如何调用和传递参数

是不可能的,因为Method1Method2不是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

首先,Method2 不能用作您的委托。这样做也不是一个好的做法。您可以尝试通过反射来做到这一点,但对于将阅读您的代码的其他人来说,这将很难理解。所以,我认为,你应该使用所有方法,比如委托类型,但强制转换为方法内部需要的类型,如下所示:

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

或者使用之前答案中的某种闭包。