提问人:Chos5555 提问时间:10/23/2022 更新时间:4/5/2023 访问量:152
将命名可选参数的名称传递给 C 中的方法#
Passing a name of named optional argument to a method in C#
问:
我想知道我是否可以做这样的事情,即传递命名可选参数的名称以在方法调用中使用它。我正在使用库中的一种方法,该方法具有 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;
}
感谢您:)的任何回复
答:
0赞
Guru Stron
10/23/2022
#1
假设“选项”名称是“动态”传递的,您可以使用一些反射(否则方法没有多大意义,因为只是工作并且是更好/安全的选项):Test
TestHelper(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;
}
}
请注意,在一般情况下,反射的成本非常高,因此,如果在应用程序生存期内经常调用该方法,则应考虑“缓存”它,例如,通过使用表达式树或仅使用源生成器生成方法主体。
评论