将命名可选参数的名称传递给 C 中的方法#

Passing a name of named optional argument to a method in C#

提问人:Chos5555 提问时间:10/23/2022 更新时间:4/5/2023 访问量:152

问:

我想知道我是否可以做这样的事情,即传递命名可选参数的名称以在方法调用中使用它。我正在使用库中的一种方法,该方法具有 50 个可选的命名参数(它们仅更改权限的值,对上下文并不重要)。

有没有办法传递参数名称?我不必复制粘贴几乎相同的方法,只是在最后使用不同的参数来更改不同的权限

void Main()
{
  Test("first", "Hello");
  Test("third", "World");
}

void Test(string option, string value)
{
  // Do something
  TestHelper(option:value);
}

void TestHelper(string? first = null, string? second = null, string? third = null)
{
  // Do something
  return;
}

感谢您:)的任何回复

C# 可选参数 named-parameters

评论

1赞 Joe Sewell 10/23/2022
我认为您需要使用 Reflection API 来做这样的事情;它不直接在语言或运行时中受支持。
0赞 Chos5555 10/23/2022
反思,这正是我需要但不知道的东西。谢谢!

答:

0赞 Guru Stron 10/23/2022 #1

假设“选项”名称是“动态”传递的,您可以使用一些反射(否则方法没有多大意义,因为只是工作并且是更好/安全的选项):TestTestHelper(first: "Hello")

class Helper
{
    public void Test(string option, string value)
    {
        var methodInfo = typeof(Helper).GetMethod(nameof(TestHelper));
        var parameterInfos = methodInfo.GetParameters();
        // todo - add runtime error for the case of invalid parameter name passed.
        methodInfo.Invoke(this, parameterInfos.Select(p => p.Name == option ? value : null).ToArray());
    }

    public void TestHelper(string? first = null, string? second = null, string? third = null)
    {
        // Do something
        return;
    }
}

请注意,在一般情况下,反射的成本非常高,因此,如果在应用程序生存期内经常调用该方法,则应考虑“缓存”它,例如,通过使用表达式树或仅使用源生成器生成方法主体。