如何通过反射执行带有可选参数的私有静态方法?
我有一个带有带有可选参数的私有静态方法的类。如何通过反射从另一个类调用它?有一个类似的问题,但它不涉及静态方法或可选参数。
public class Foo {
private static void Bar(string key = "") {
// do stuff
}
}
如何调用 Foo.Bar("test")
和 Foo.Bar()
(例如,不传递可选参数)?
I have a class with a private static method with an optional parameter. How do I invoke it from another class via Reflection? There is a similar question, but it does not address static method or optional parameters.
public class Foo {
private static void Bar(string key = "") {
// do stuff
}
}
How do I invoke Foo.Bar("test")
and Foo.Bar()
(e.g. without passing the optional parameter)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
C# 中的可选参数值是通过在调用站点注入这些值来编译的。即,即使您的代码是
编译器实际上会生成一个调用,例如
当查找方法时,您需要将可选参数视为常规参数。
如果您确切地知道要使用哪些值来调用该方法,则可以执行以下操作:
如果您只有一些参数并且想要遵守默认参数的值,则必须检查该方法的
ParameterInfo
对象以查看参数是否可选以及这些值是什么是。例如,要打印出这些参数的默认值,您可以使用以下代码:Optional parameter values in C# are compiled by injection those values at the callsite. I.e. even though your code is
The compiler actually generates a call like
When finding the method you need to treat the optional parameters as regular parameters.
If you know exactly what values you want to invoke the method with you can do:
If you only have some of the parameters and want to honor the values of the default ones you have to inspect the method's
ParameterInfo
objects to see if the parameters are optional and what those values are. For example to print out the default values of those parameters you could use the following code:使用此类
您可以使用以下代码以默认值调用它
如果该方法有一些非可选参数,则必须在调用该方法之前将它们插入到参数数组中。
例如,
需要您
在调用之前执行以下操作
Using this class
You can use the following code to call it with the default values
If the method had some non-optional parameters, you will have to insert them into the parameters array before invoking the method.
E.g
Would require you to do
Before invoking
我为单元测试编写的内容:
然后像这样调用它以调用私有静态函数:
免责声明:我仅将其用于具有返回值的函数。尝试执行没有返回值的方法将引发异常。
Something i wrote for my unit tests:
Then call it like so to invoke a private static function:
Disclaimer: I use this for functions with a return value only. Attempting to execute a method with no return value will throw an exception.