我需要创建一个映射到其值的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
。
我尝试做的甚至可能实现吗?或者还有另一种方法可以解决这个问题吗?
答案 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);
}