委托方法 - 如果我不知道什么类型或多少参数,如何调用和传递参数
本文关键字:参数 何调用 调用 如果 方法 我不知道 什么 多少 类型 | 更新日期: 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?
});
这可能吗?也许我实施错误了什么?
这
是不可能的,因为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
。
首先,Method2 不能用作您的委托。这样做也不是一个好的做法。您可以尝试通过反射来做到这一点,但对于将阅读您的代码的其他人来说,这将很难理解。所以,我认为,你应该使用所有方法,比如委托类型,但强制转换为方法内部需要的类型,如下所示:
public void Method1(params object[] pars)
{
string value = (string)pars[0];
Guid id = (Guid)pars[1];
}
或者使用之前答案中的某种闭包。