public void MethodInspectingItsOwnParameters(
[Description("First parameter")]
string paramName_1,
[Description("Second parameter")]
int paramName_2,
// ...
[Description("N-th parameter")]
object paramName_N,
// ...
[Description("Last parameter")]
bool paramName_M)
{
var paramsAndValues = new List<KeyValuePair<string, object>>();
// -
// => Put here the code that, using Roslyn's compile time
// metaprogramming, inspect the parameters from the method
// definition and at compile time generate the code that
// at run time will get the parameters's values and load
// them into [paramsAndValues]
// -
// #Rosalyn generated code
// · Code autogenerated at compile time
// => loads parameter's values into [paramsAndValues]
// -
// Eg (Hypothetical example of the code generated at compile
// time by Roslyn's metaprogramming):
//
// paramsAndValues.Add("paramName_0", paramName_1);
// ...
// paramsAndValues.Add("paramName_N", paramName_N);
// ...
// paramsAndValues.Add("paramName_M", paramName_M);
//
// - Note: this code will be regenerated with each compilation,
// so there no make sense to do nameof(paramName_N)
// to obtaint parameter's name
// #End Rosalyn generated code
foreach (var param in paramsAndValues)
{
string paramName = param.Key;
object paramValue = param.Value;
// In this section of the normal code (not generated at
// compile time) do what you require with the
// parameters/values already loaded into [paramsAndValues]
// by the compile time generated code
}
}
7条答案
按热度按时间jtjikinw1#
调用
MethodBase.GetCurrentMethod().GetParameters()
。但是,无法获取参数值;由于JIT优化,它们甚至可能不再存在。
a0x5cqrl2#
MethodInfo.GetCurrentMethod()
将给予有关当前方法的信息,然后使用GetParameters()
获取有关参数的信息。t98cgbkg3#
你想做的事情可以通过面向方面的编程很容易地实现。网上有很多很好的教程,我会指出其中的两个:
vktxenjb4#
euoag5mw5#
您需要AOP来实现您正在寻找的东西。在C#中,你可以使用DispatchProxy来实现这一点。检查以下如何将现有对象示例 Package 到DispatchProxy中?
3gtaxfhh6#
现在可以用来实现这一点的一个功能是Roslyn's Source Generators。
通过这种方式,获取参数值的代码将在编译时基于方法定义生成。可以解释为“* 编译时反射 *”。
让我们举一个例子来更好地解释它:
4xy9mtcn7#
我也遇到了同样的问题,下面是我记录所有参数及其值的解决方案。仅在Controller Context中:
希望能帮上忙