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

时间:2016-03-10 20:55:39

标签: c# lambda c#-6.0 nameof

我需要创建一个映射到其值的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的输出。

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

我试图使用委托和名称来解决这个问题:

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

我尝试做的甚至可能实现吗?或者还有另一种方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

我想出的一个解决方案是通过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);
}