来自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);
}
}
}