C# 委托方法-如果我没有';我不知道什么类型或者有多少个参数

C# 委托方法-如果我没有';我不知道什么类型或者有多少个参数,c#,delegates,C#,Delegates,假设我有一位代表 public delegate void MyAction(params object[] args); 还有一个类,它的子类使用delagate public class MyClass { public List<MySubClass> mySubClasses; } public class MySubClass { public string myString; public MyAction myDelegateMethod;

假设我有一位代表

public delegate void MyAction(params object[] args);
还有一个类,它的子类使用delagate

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

public class MySubClass {
    public string myString;
    public MyAction myDelegateMethod;
}
我将如何在运行时调用这些方法中的每一个,并传入相应的参数

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

x、 myDelegateMethod;//这是不可能的,因为
Method1
Method2
不是
void(params对象)
委托。考虑到它们返回不同的值并执行不同的参数,它们不是同一类型(甚至可以转换为兼容类型)

如果您想要执行任意方法,那么我能想到的唯一方法就是将包装方法执行作为操作:

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

在这种情况下,您需要显式包装您想要做的任何事情(使用创建时已知的参数)首先,方法2不能用作您的代理。这样做也不是一个好的做法。您可以尝试通过反射来执行此操作,但其他人很难理解,因为他们会阅读您的代码。 因此,我认为,您应该使用所有方法,如委托类型,但强制转换需要方法内部的类型,如下所示:

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

或者使用上一个答案中的某种闭包。

那么您将传入哪些参数?@KirkWoll Method1(myObject)和Method2(“abc”,myGuid)如果我错了,请纠正我,但这似乎是测试数据。我假设您实际上希望传递真实的参数,即从其他地方派生的参数。如果是这样,我很好奇,如果给定任意数量的潜在参数,您将如何处理这些参数。(撇开调用它的全部困难不谈)@KirkWoll你的回答是正确的,这就是我的问题所在,但我不理解——甚至在概念上——你如何知道在调用站点传递委托的参数?你有,
x.myDelegateMethod
——参数是什么?你从哪里得到它们?它们可以从
x
获得吗?现在还不清楚是什么您想传入的Gments。您不熟悉
委托.DynamicInvoke
?当然可以,但我的印象是OP需要一个强类型委托处理程序。但是,如果您在实际调用
myClass.ForEach(x=>x.Method())之前不知道参数的值会是什么,您会怎么做;
这和上面的答案是问题的症结所在。您的委托没有
void(params object[]pars)的形式
因此它们与委托定义不匹配。使用此答案中的技巧可以让每个方法使用不同的参数参数。但是,请确保检查有效参数,否则会遇到更严重的问题。
myClass.ForEach(x => x.Method());
public void Method1(params object[] pars)
{
    string value = (string)pars[0];
    Guid id = (Guid)pars[1];
}