.net 从方法内部获取方法的参数名称和值

vhipe2zx  于 2023-05-19  发布在  .NET
关注(0)|答案(7)|浏览(240)

在.NET中有没有一种方法可以知道传递给方法的参数和它们的值。反思方式?这将在方法内部使用。它必须是通用的,以便可以从任何方法中使用。这是为了记录目的。

jtjikinw

jtjikinw1#

调用MethodBase.GetCurrentMethod().GetParameters()
但是,无法获取参数值;由于JIT优化,它们甚至可能不再存在。

a0x5cqrl

a0x5cqrl2#

MethodInfo.GetCurrentMethod()将给予有关当前方法的信息,然后使用GetParameters()获取有关参数的信息。

t98cgbkg

t98cgbkg3#

你想做的事情可以通过面向方面的编程很容易地实现。网上有很多很好的教程,我会指出其中的两个:

vktxenjb

vktxenjb4#

public void FunctionWithParameters(string message, string operationName = null, string subscriptionId = null)
{
    var parameters = System.Reflection.MethodBase.GetCurrentMethod().GetParameters();
    this.PrintParams(parameters, message, operationName, subscriptionId);

}

public void PrintParams(ParameterInfo[] paramNames, params object[] args)
{
    for (int i = 0; i < args.Length; i++)
    {
        Console.WriteLine($"{paramNames[i].Name} : {args[i]}");
    }
}

euoag5mw

euoag5mw5#

您需要AOP来实现您正在寻找的东西。在C#中,你可以使用DispatchProxy来实现这一点。检查以下如何将现有对象示例 Package 到DispatchProxy中?

3gtaxfhh

3gtaxfhh6#

现在可以用来实现这一点的一个功能是Roslyn's Source Generators
通过这种方式,获取参数值的代码将在编译时基于方法定义生成。可以解释为“* 编译时反射 *”。
让我们举一个例子来更好地解释它:

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
    }
}
4xy9mtcn

4xy9mtcn7#

我也遇到了同样的问题,下面是我记录所有参数及其值的解决方案。仅在Controller Context中

public static string CallParams = "";
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         base.OnActionExecuting(filterContext);                    
         CallParams = JsonConvert.SerializeObject(filterContext.ActionParameters);
    }

希望能帮上忙

相关问题