0

我需要创建一个 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);

我想要一个像 string 这样的输出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 中的变量名称而不是原始参数名称 - 因此每个值都错误地parameter从 lambda 映射到。

我正在尝试做的事情甚至可能实现吗?还是有另一种方法可以解决这个问题?

4

1 回答 1

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);
}
于 2016-03-10T23:55:22.127 回答