我面临一个情况,我有一个包含不同类型约15个属性的业务对象。此业务对象还必须实现一个接口,该接口具有以下方法:
object GetFieldValue(string FieldName);
我可以看到实现这个方法的两种方式:
使用 switch 语句:
switch ( FieldName )
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
使用字典(SortedDictionary或HashTable):
return this.AllFields[FieldName];
哪种方法更有效率?
补充:忘记说了。这种方法是用于在网格中显示项目。该网格将具有每个属性的列。通常会有包含1000多个项目的网格。这就是为什么我关心性能的原因。
第二个补充:
一个想法:混合方法。创建一个静态字典,其键为属性名称,值为数组中的索引。该字典仅在应用程序启动时填充一次。每个对象实例都有一个数组。因此,查找将如下所示:
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语句是否更快且更易于维护...