我已经围绕第三方库编写了一个包装类,需要通过调用 Config 方法并传递格式为“ Property = Value 的字符串来设置属性“
我想在一次调用中传递所有属性并迭代处理它们。
我考虑过以下几点:
所有这些都可行(我正在考虑使用选项1)但是有更好的方法吗?
关于我的查询的更详细信息:
完成的类将包含在库中,以便在其他应用程序中重用。虽然我目前没有将线程视为一个问题(我们的应用程序往往只有一个UI线程和一个工作线程),但它可能会在未来成为一个问题。
垃圾收集不会成为问题。
目前不存在访问数据源的任意索引的问题。
优化目前不是问题,但明确定义键/值对很重要。
答案 0 :(得分:1)
您可以使用Dictionary<string,string>
,这些项目的类型为KeyValuePair<string,string>
(这与您的第一个想法相对应)
然后,您可以使用myDict.Select(kvp=>string.Format("{0}={1}",kvp.Key,kvp.Value))
获取具有所需格式的字符串列表
答案 1 :(得分:1)
正如您已经指出的那样,任何提议的解决方案都将完成您所描述的任务。这意味着选择特定方法的唯一合理方法是定义您的要求:
ConcurrentDictionary
是有道理的。否则,没有理由承担使用并发数据结构的额外开销和复杂性。List<KeyValuePair<String, String>>
。Dictionary
是更好的选择。如果没有完全定义该功能需要做什么,您无法做出关于如何实现功能的明智决定,并且因为您还没有这样做,这里给出的任何答案都必然是不完整的。
鉴于您的澄清,我个人会建议以下内容:
根据MSDN指南,默认情况下避免使您的Config()方法成为线程安全的:
默认情况下,类库不应该是线程安全的。添加锁以创建线程安全的代码会降低性能,增加锁争用,并且可能会发生死锁错误。
如果线程安全在以后变得重要,请将其作为来电者的责任。
鉴于您没有特殊的性能要求,请坚持使用字典以便轻松定义和读取键/值对。
为了简单起见,为了避免产生大量不必要的字符串进行连接,只需直接传递字典并迭代它。
考虑以下示例:
var configData = new Dictionary<String, String>
configData["key1"] = "value1";
configData["key2"] = "value2";
myLibraryObject.Config(configData);
Config的实现:
public void Config(Dictionary<String, String> values)
{
foreach(var kvp in values)
{
var configString = String.Format("{0}={1}", kvp.Key, kvp.Value);
// do whatever
}
}
答案 2 :(得分:0)
例如使用ConcurrentDictionary<string,string>
- 它是线程安全且非常快,因为大多数操作都是无锁实现的......
答案 3 :(得分:0)
您可以创建一个使用反射的辅助类将任何类转换为Property = Value集合
public static class PropertyValueHelper
{
public static IEnumerable<string> GetPropertyValues(object source)
{
Type t = source.GetType();
foreach (var property in t.GetProperties())
{
object value = property.GetValue(source, null);
if (value != null)
{
yield return property.Name + "=" + value.ToString();
}
else
{
yield return property.Name + "=";
}
}
}
}
您需要添加额外的逻辑来处理枚举,索引属性等。