首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#参数中的键值对

C#参数中的键值对
EN

Stack Overflow用户
提问于 2009-08-23 22:15:28
回答 9查看 61.2K关注 0票数 43

我正在寻找一种方法来实现如下功能:

代码语言:javascript
复制
myFunction({"Key", value}, {"Key2", value});

我相信有一些匿名类型的东西是非常容易的,但我没有看到它。

我能想到的唯一解决方案是有一个params KeyValuePair<String, object>[] pairs参数,但最终结果类似于:

代码语言:javascript
复制
myFunction(new KeyValuePair<String, object>("Key", value),
           new KeyValuePair<String, object>("Key2", value));

无可否认,这要丑陋得多。

编辑:

为了清楚起见,我正在编写一个在两个不同系统之间传递的Message类。它包含一个指定消息类型的ushort,以及一个用于与消息关联的“数据”对象的字符串字典。我希望能够在构造函数中传递所有这些信息,所以我可以这样做:

代码语言:javascript
复制
Agent.SendMessage(new Message(MessageTypes.SomethingHappened, "A", x, "B", y, "C", z));

或类似的语法。

EN

回答 9

Stack Overflow用户

发布于 2009-08-24 00:45:30

有趣的是,我刚刚(几分钟前)创建了一个方法,使用匿名类型和反射来实现这一点:

代码语言:javascript
复制
MyMethod(new { Key1 = "value1", Key2 = "value2" });


public void MyMethod(object keyValuePairs)
{
    var dic = DictionaryFromAnonymousObject(keyValuePairs);
    // Do something with the dictionary
}

public static IDictionary<string, string> DictionaryFromAnonymousObject(object o)
{
    IDictionary<string, string> dic = new Dictionary<string, string>();
    var properties = o.GetType().GetProperties();
    foreach (PropertyInfo prop in properties)
    {
        dic.Add(prop.Name, prop.GetValue(o, null) as string);
    }
    return dic;
}
票数 9
EN

Stack Overflow用户

发布于 2009-08-24 00:06:18

这有点麻烦,但您可以让Message类实现IEnumerable接口,并为其提供一个Add方法。然后,您将能够使用集合初始值设定项语法:

代码语言:javascript
复制
Agent.SendMessage
(
    new Message(MessageTypes.SomethingHappened) {{ "foo", 42 }, { "bar", 123 }}
);

// ...

public class Message : IEnumerable
{
    private Dictionary<string, object> _map = new Dictionary<string, object>();

    public Message(MessageTypes mt)
    {
        // ...
    }

    public void Add(string key, object value)
    {
        _map.Add(key, value);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable)_map).GetEnumerator();
        // or throw a NotImplementedException if you prefer
    }
}
票数 7
EN

Stack Overflow用户

发布于 2009-08-23 22:20:11

使用字典:

代码语言:javascript
复制
myFunction(new Dictionary<string, object>(){
  {"Key", value}, 
  {"Key2", value}});

简单地说,您只需要一个new Dictionary<K, V>,而不是每个参数。获取键和值很简单。

或使用匿名类型:

代码语言:javascript
复制
myFunction(new {
  Key = value, 
  Key2 = value});

在函数内部使用它不是很好,你需要反射。这看起来像这样:

代码语言:javascript
复制
foreach (PropertyInfo property in arg.GetType().GetProperties())
{
  key = property.Name;
  value = property.GetValue(arg, null);
}

(直截了当地说,可能有一些错误……)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1319708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档