Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为方法生成命名的'params'参数?_C#_.net - Fatal编程技术网

C# 如何为方法生成命名的'params'参数?

C# 如何为方法生成命名的'params'参数?,c#,.net,C#,.net,C#有一个很棒的params关键字,用于将任意数量的参数传递给函数,如String.Format()。但如果我需要传递命名参数(键值对),该怎么办?最好的方法是什么(我正在寻找调用方的简短语法) func(新字典{{“param1”,val1},{“param2”,val2}}太麻烦了 func(param1=>val1,param2=>val2)和func(new{param1=val1,param2=val2})但这看起来像是语言滥用,这些功能不应该这样使用 在dynamic对象上,我可以

C#有一个很棒的
params
关键字,用于将任意数量的参数传递给函数,如
String.Format()
。但如果我需要传递命名参数(键值对),该怎么办?最好的方法是什么(我正在寻找调用方的简短语法)

  • func(新字典{{“param1”,val1},{“param2”,val2}}
    太麻烦了
  • func(param1=>val1,param2=>val2)
    func(new{param1=val1,param2=val2})
    但这看起来像是语言滥用,这些功能不应该这样使用
  • dynamic
    对象上,我可以解析可选的参数名称
    func(param1:val1,param2:val2)
    ,这看起来是一个不错的解决方案,但对于常见的对象方法不起作用

如果.NET Framework 4适合您,也许您可以使用


您可以创建一些函数重载。当调用方只有1或2个参数时,这些重载将封装字典的用法

public void Foo (string paramA, object valueA)
{
   this.Foo(new Dictionary<string, object> { { paramA, valueA } });
}

public void Foo (string paramA, object valueA, string paramB, object valueB)
{
   this.Foo(new Dictionary<string, object> { { paramA, valueA },{ paramB, valueB } });
}

public void Foo (Dictionary<string, object> args)
{
}
public void Foo(字符串参数,对象值a)
{
this.Foo(新字典{paramA,valueA});
}
public void Foo(字符串参数、对象值A、字符串参数B、对象值B)
{
this.Foo(新字典{paramA,valueA},{paramB,valueB});
}
公共void Foo(字典参数)
{
}

有一个库的API与您想要制作的API类似,示例是iTween。它在一些游戏开发人员圈子中是众所周知的,所以这种做法不算太坏

它使用一个helper函数创建一个传递给主函数的哈希表。您可以这样调用它:

iTween.MoveTo(camera, iTween.Hash("path", iTweenPath.GetPath("CamPath"), "looktarget", player,
                                  "looktime", 0f, "speed", 2, "easetype", iTween.EaseType.linear));
它是开源的,因此如果您想搜索“itween.cs”,可以查看它。helper函数获取一个
params object[]args
参数列表,确保每个参数都是有效类型,然后将其放入哈希表中。参数名(必须是字符串),然后是参数(在您的情况下,这将是一个对象)。主函数将访问作为哈希表元素的参数


它根本不是类型安全的。但我认为这是实现您要求的唯一方法。

动态和通用对象是什么意思?最后一个选项对我来说很好。老实说,我认为第二个选项中的匿名类型部分是相当合理的。也许如果您给我们更多的上下文,我们可以想出非常不同的解决方案“不过,@piojo我的意思是在函数声明中不指定参数名和计数。假设您希望使用
String.Format()
函数而不是使用索引来命名格式参数。但是调用将类似于
func(新元组(“param1”,val1),元组(“param2”,val2))
。它看起来比使用字典更糟糕。@Poma它可以更整洁一些:
func(Tuple.Create(“param1”,val1),Tuple.Create(“param2”,val2))
void MyFunction(string[] names, int[] values)

// Example of call
MyFunction(new[] {"pipo", "poil"}, new[] {1, 2});
public void Foo (string paramA, object valueA)
{
   this.Foo(new Dictionary<string, object> { { paramA, valueA } });
}

public void Foo (string paramA, object valueA, string paramB, object valueB)
{
   this.Foo(new Dictionary<string, object> { { paramA, valueA },{ paramB, valueB } });
}

public void Foo (Dictionary<string, object> args)
{
}
iTween.MoveTo(camera, iTween.Hash("path", iTweenPath.GetPath("CamPath"), "looktarget", player,
                                  "looktime", 0f, "speed", 2, "easetype", iTween.EaseType.linear));