如何动态调用带有可选参数的方法?

3

我希望你能帮我。

使用C#是否可以实现以下功能?

我有一个方法:

void SomeMethod(int p1 = 0, bool p2 = true, string p3 = "")
{
    // some code
}

我需要在编译时使用未知数量的参数调用此方法。我的意思是,在运行时,应用程序应该从xml(例如)中加载关于参数的信息,并使用这些参数调用该方法。Xml文件可能包含0到3个参数。

如何使用从xml中加载的未知数量的参数调用 SomeMethod 方法?

谢谢


3是参数的最大数量吗?还是可能有更多,因为您可以在函数名称中使用不同的参数。 - ZoomVirus
Karl,不,3个参数只是举例。它可能是10甚至20。 - Alex Maroz
为什么不直接使用List<Int>、List<String>、List<Boolean>等呢? - paparazzo
因为每个参数在方法中都有独特的作用。这不仅仅是某些东西的ID列表或名称列表。 - Alex Maroz
2个回答

6
您可以使用反射来完成:
  • 通过传递所有三个参数类型,获取 MethodInfo
  • 获取运行时参数值。
  • 通过调用 GetParameters()MethodInfo 获取参数元数据 ParameterInfo\[\]
  • 对于每个缺失的参数,检查 HasDefaultValue,如果有,则获取 DefaultValue
  • 将默认值数组附加到传入值的数组中。您将得到一个包含三个对象的数组。
  • 将结果数组传递给使用反射获得的方法。

好的解决方案。我会尝试这样做。谢谢。 - Alex Maroz
+1... 可读性强且易于学习的反射方式,但正确的方法是将 Type.Missing 作为参数传递 - https://dev59.com/IHE95IYBdhLWcg3wMa51 - Alexei Levenkov

0

将参数读入变量中,并根据找到的参数数量调用SomeMethod方法。例如,如果您有p1的有效值,请调用SomeMethod(p1); 如果有p1和p2的有效值,则调用SomeMethod(p1,p2)...以此类推。


这样行不通。因为在有10个参数的情况下,我需要“硬编码”很多组合。 - Alex Maroz
哦,好的。我在想你是否有可变数量的参数。我认为@dasblinkenlight提出的建议会有用。 - Aditya Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接