c#中的键值数组输入参数


Key Value array in C# put into parameter

来自PHP,我以前从未写过c#,我在c#中遇到过这样的东西:

public string rule(string playerId, string action, params string[] optionalData){
...
}

在PHP中是这样的

public function rule($playerId, $action, $optionalData=array()){
...
}

在PHP中,我只是像这样填写$optionalData的参数…

myVar->rule("123", "myAction", array('url'=>'review.com');

然而,在c#中,我不确定如何填充optionalData (params string[] optionalData)参数,因为它是一个键值参数(如PHP示例)。我的问题是如何创建一个键值数组就像我在例子中创建的PHP一样,并将其放入参数中?

CoolClass cc = new CoolClass();
cc.rule("123", "myAction", ???);

我正在搜索谷歌,正在查看字典和哈希映射等,但我猜这是一个过度杀伤或它不起作用…

多谢!

当您查看字典时,您肯定是在查找正确的工具。

如果c#中的rule()在您自己的代码中,我是否建议将签名更改为:

public string rule(string playerId, string action, IDictionary<string, string> optionalData = new Dictionary<string, string>()){
...
}

这允许你做什么:

  • 以其他c#程序员期望的方式对optionalData中的值进行操作。
  • 建议方法签名中的= new Dictionary<string, string>()部分使该参数真正可选。在调用该方法时,它是不必要的。
  • 您可以使用IDictionary<T>方法来处理数据。您应该熟悉一些语法(考虑通过键optionalData["someString"]访问)

但是,如果rule()不在您的代码中,您可以通过简单地省略参数来省略optionalData。您的问题中原始c#方法的有效调用示例:

  • rule("Bob", "load")
  • rule("Bob", "load", "url", "www.example.com")(在本例中,optionalData[0].Equals("url", StringComparisonOptions.Ordinal)optionalData[1].Equals("www.example.com", StringComparisonOptions.Ordinal)为true。

关于原始方法需要考虑的一件事-记住rule("Bob", "load", 'url")是一个有效的调用,并且您需要进行运行时检查以确保您拥有正确数量的参数。使用Dictionary<TKey, TValue>的另一个优点。如果无法更改原始rule(),您甚至可以考虑编写一个适配器方法。

你可以使用字典:

Dictionary<string,string[]>

或者像

Dictionary<int, string[]>

我相信字典对你的情况会有用。

您可以使用Dictionary <key_datatype, value_datatype>

例子:

你的方法定义在这里:

public string rule(string playerId, string action, Dictionary<string, string> optionalData){
...
}

方法调用:

Dictionary<string, string> optionalData = new Dictionary<string, string>();
optionalData.Add("url", "review.com");
cc.rule("123", "myAction", optionalData);

您可以使用DynamoObject使其更易于编写:

    dynamic optionalData = new ExpandoObject();
//The token after the dynamoObject period will be the key to the assigned value.
    optionalData.url = "review.com";
    cc.rule("123", "myAction", optionalData);

你的方法可以得到这样的键值对:

public string rule(string playerId, string action, dynamic optionalData)
{
...
            foreach (var pair in (IDictionary<string, object>)optionalData)
            {
                if (group.Key == "url")
                {
                   Console.WriteLine(group.Value);
                }
                else if (group.Key == "post")
                {
                    Console.WriteLine(group.Value);
                }
            }
 }