Vil*_*lx- 11 .net dictionary switch-statement
我有一种情况,我有一个业务对象,有大约15种不同类型的属性.业务对象还必须实现具有以下方法的接口:
object GetFieldValue(string FieldName);
Run Code Online (Sandbox Code Playgroud)
我可以看到实现此方法的两种方法:
使用switch语句:
switch ( FieldName )
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Run Code Online (Sandbox Code Playgroud)
使用字典(SortedDictionary或HashTable?):
return this.AllFields[FieldName];
Run Code Online (Sandbox Code Playgroud)
哪个会更有效率?
补充:忘了说.此方法用于在网格中显示项目.网格将为每个属性都有一列.通常会有超过1000个项目的网格.这就是为什么我关注性能.
新增2:
这是一个想法:混合方法.创建一个静态字典,其中键是属性名称,值是数组中的索引.在应用程序启动时,字典仅填充一次.每个对象实例都有一个数组.所以,查找将是:
return this.ValueArray[StaticDictionary[FieldName]];
Run Code Online (Sandbox Code Playgroud)
字典填充算法可以使用反射.然后将相应地实现属性本身:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到这个问题吗?
它也可以更进一步,ValueArray/StaticDictionary可以放在一个单独的泛型类型中ValueCollection<T>
,其中T
将指定反射的类型.ValueCollection还将处理尚未设置任何值的情况.然后可以将属性简单地写为:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我开始怀疑,如果一个简单的switch语句可能不会更快更容易维护....
Ash*_*Ash 21
switch: good efficiency, least maintainable
dictionary: good efficiency, better maintainability
reflection: least efficient, best maintainability
Run Code Online (Sandbox Code Playgroud)
提示:忽略效率并仅担心可维护性,除非您实际测试了性能并发现它是一个问题.
我不是说反射是你唯一的选择,只是它允许你根据需要添加/删除和重命名属性,而不需要保持switch语句或字典同步.