来自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", ???);
我正在搜索谷歌,正在查看字典和哈希图等,但我猜这是一个矫枉过正或它不起作用..
非常感谢!
答案 0 :(得分:0)
您可以使用词典:
Dictionary<string,string[]>
或类似的东西:
Dictionary<int, string[]>
我相信字典会适用于你的情况。
答案 1 :(得分:0)
当你看着字典时,你肯定在寻找合适的设施。
如果C#中的rule()
位于您自己的代码中,我是否可以建议您将签名更改为:
public string rule(string playerId, string action, IDictionary<string, string> optionalData = new Dictionary<string, string>()){
...
}
这可以让你做到:
optionalData
的方式操作其他C#程序员期望的方式。 = 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)
为真。关于原始方法需要考虑的一件事 - 请记住rule("Bob", "load", 'url")
是一个有效的调用,您需要进行运行时检查以确保您拥有正确数量的参数。使用Dictionary<TKey, TValue>
的另一个好处。如果无法更改原始rule()
,您甚至可以考虑编写适配器方法。
答案 2 :(得分:0)
您可以使用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);
}
}
}