【问题标题】:Is it possible to get name of variables passed as `params object[]`?是否可以获得作为`params object []`传递的变量名称?
【发布时间】:2018-09-21 16:59:11
【问题描述】:

我想知道,是否可以通过params object[] values 获取传递给方法的变量名称?

方法的签名是这样的:

public static void ExecuteSafely(
    Action callback,
    string command,
    params object[] values)
{
    // code here
}

我试图通过nameof(values[index]) 获取值,但它告诉我:

表达式没有名称。

这里的重点是动态的给SQL命令添加参数,如果我可以根据params的名字来添加参数会更容易,传递的参数也更少,但是这些参数的数量参数应该是可变的。

您能推荐任何解决方案或其他方法吗?

【问题讨论】:

  • 使用字典或匿名对象。
  • @poke 你的意思是而不是object(string name, object value)
  • 一个字典,即Dictionary<string, object>,或者只是一个object,您使用反射来检索属性名称和值。所以你要么调用方法Foo(new Dictionary<string, object> { ["foo"] = 2, ["bar"] = "hello" })要么Foo(new { foo = 2, bar = "hello" })
  • 看来是合法的,我会试试看
  • 一定有办法做到这一点吧?我正在查看一个新的 StackTrace() 以及它的框架、方法、ParameterInfos 等,并且......没有运气。我猜当编译器编译代码时,转换为对象数组的变量以及这些变量的名称不会保留在堆栈跟踪中?但也许他们在那里的某个地方?!?

标签: c# .net


【解决方案1】:

不,这是不可能的。 nameof 是一个编译时特性,你想要在运行时变量的名称(可以动态创建一个数组)。

如果名称对您很重要,请使用 Dictionary<string, object>C#7 a named tuple

public static void ExecuteSafely(Action callback, string command, 
    params (string name, object value)[] commandParameters)
{
    foreach ((string Name, object Value) commandParameter in commandParameters)
    {
        string name = commandParameter.Name;
        object value = commandParameter.Value;
        // ...
    }
}

这样称呼它:

ExecuteSafely(yourAction, "CreateUser", ("UserName", "Tim Schmelter"));

【讨论】:

  • 我是用元组做的,非常感谢,我会在 5 分钟内接受答复
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2017-08-22
  • 2022-06-14
  • 1970-01-01
  • 2011-11-03
  • 2015-05-16
相关资源
最近更新 更多