我正在寻找一种方法来实现如下功能:
myFunction({"Key", value}, {"Key2", value});
我相信有一些匿名类型的东西是非常容易的,但我没有看到它。
我能想到的唯一解决方案是有一个params KeyValuePair<String, object>[] pairs
参数,但最终结果类似于:
myFunction(new KeyValuePair<String, object>("Key", value),
new KeyValuePair<String, object>("Key2", value));
无可否认,这要丑陋得多。
编辑:
为了清楚起见,我正在编写一个在两个不同系统之间传递的Message
类。它包含一个指定消息类型的ushort
,以及一个用于与消息关联的“数据”对象的字符串字典。我希望能够在构造函数中传递所有这些信息,所以我可以这样做:
Agent.SendMessage(new Message(MessageTypes.SomethingHappened, "A", x, "B", y, "C", z));
或类似的语法。
发布于 2009-08-24 00:45:30
有趣的是,我刚刚(几分钟前)创建了一个方法,使用匿名类型和反射来实现这一点:
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;
}
发布于 2009-08-24 00:06:18
这有点麻烦,但您可以让Message
类实现IEnumerable
接口,并为其提供一个Add
方法。然后,您将能够使用集合初始值设定项语法:
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
}
}
发布于 2009-08-23 22:20:11
使用字典:
myFunction(new Dictionary<string, object>(){
{"Key", value},
{"Key2", value}});
简单地说,您只需要一个new Dictionary<K, V>
,而不是每个参数。获取键和值很简单。
或使用匿名类型:
myFunction(new {
Key = value,
Key2 = value});
在函数内部使用它不是很好,你需要反射。这看起来像这样:
foreach (PropertyInfo property in arg.GetType().GetProperties())
{
key = property.Name;
value = property.GetValue(arg, null);
}
(直截了当地说,可能有一些错误……)
https://stackoverflow.com/questions/1319708
复制相似问题