是否可以在 lambda 表达式中使用 nameof() 获取原始参数名称?

Is it possible to get the original parameter name using nameof() in a lambda expression?

我需要创建一个 CSV 样式的参数字符串映射到它们的值。 例如:

static void MyMethod(int i, string str, object obj, bool flag)
{
    string example = "i=123,str=Hello,obj=1.0,flag=false";
}

被称为:

MyMethod(123, "Hello", 1.0, false);

我想要一个类似于字符串 example 的输出。

我需要为大量方法执行此操作,这些方法具有许多不同的签名,并且可能不会在每个方法中使用没有可辨别的模式的所有参数 - 因此我尝试创建一种方法来使该过程稍微自动化。

我尝试使用委托和 nameof 来解决这个问题:

delegate string GetParametersDelegate(params object[] parameters);

static GetParametersDelegate GetParametersFunc = (parameters) =>
{
    return string.Join(",", parameters
        .Select(parameter => nameof(parameter) + "=" + parameter));
};

被称为:

static void MyMethod(int i, string str, object obj, bool flag)
{
    string notTheResultIWant = GetParameters(i, str, obj, flag);
    // notTheResultIWant = "parameter=123,parameter=Hello,parameter=1.0,parameter=false"
}

我发现这会导致使用 lambda 中的变量名称而不是原始参数名称 - 因此每个值都从 lambda 错误地映射到 parameter

我正在尝试做的事情是否有可能实现?或者有其他方法可以解决这个问题吗?

我想到的一个解决方案是通过 MethodInfo 获取被调用方法的 ParameterInfo[]:

delegate string GetParametersDelegate(Delegate method, params object[] parameters);

static GetParametersDelegate GetParametersFunc = (method, parameters) =>
{
    var paramNames = method.Method.GetParameters().Select(pInfo => pInfo.Name);
    return
        paramNames.Select((name, index) => $"{name}={parameters[index]?.ToString() ?? "null"}")
            .Aggregate((a, b) => $"{a},{b}");
};

您可以拨打:

static void MyMethod(int i, string str, object obj, bool flag)
{
    var method = (Action<int, string, object, bool>)MyMethod;
    var notTheResultIWant = GetParametersFunc(method, i, str, obj, flag);
}