【发布时间】:2010-11-22 23:24:12
【问题描述】:
我有一个业务对象,其中包含大约 15 个不同类型的属性。业务对象还必须实现具有以下方法的接口:
object GetFieldValue(string FieldName);
我可以看到 2 种实现此方法的方法:
使用 switch 语句:
switch ( FieldName )
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
使用字典(SortedDictionary 还是 HashTable?):
return this.AllFields[FieldName];
哪个更有效?
补充:忘了说。此方法用于在网格中显示项目。网格将为这些属性中的每一个提供一列。通常会有超过 1000 个项目的网格。这就是我关心性能的原因。
添加 2:
这是一个想法:一种混合方法。制作一个静态字典,其中键是属性名称,值是数组中的索引。字典仅在应用程序启动时填写一次。每个对象实例都有一个数组。因此,查找将是:
return this.ValueArray[StaticDictionary[FieldName]];
字典填充算法可以使用反射。然后将相应地实现属性本身:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
谁能看出这有什么问题?
还可以更进一步,ValueArray/StaticDictionary 可以放在单独的泛型类型ValueCollection<T> 中,其中T 将指定反射类型。 ValueCollection 也将处理尚未设置值的情况。属性可以简单地写成:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
最后,我又开始怀疑,如果一个简单的 switch 语句可能不会更快更容易维护......
【问题讨论】:
-
不应该比这两个都慢吗?
-
性能重要吗(以毫秒为单位)?
-
对象将显示在一个查询属性的网格中。我通常会在这样的网格中包含大约 1000 个项目。那是 15'000 次反射调用。想想如果他们每个人都花 1 毫秒会发生什么,我不寒而栗。
-
嗬,好吧,这是相当大的也许反射不是你的情况的好选择
标签: .net dictionary switch-statement