【发布时间】:2012-06-18 15:37:36
【问题描述】:
[编辑删除我需要访问 .net 属性(副成员变量)的暗示]
我正在尝试使用 .net(具体来说是用 C# 编码的 WPF)创建一个设计模式,其中类的实例(从基类派生)具有可以通过传递枚举值来访问的成员变量一个方法调用。例如myObject.GetValueOf(dimensionFields.Latitude) 将返回 myObject 持有的“纬度”值。显然,其目的是在运行时使用GetValueOf([some enum variable]) 来访问由枚举定义的许多字段值中的任何一个。我还需要相当高的性能,因为当许多(可能很容易超过 100,000 个)对象被绘制到显示器(通过 OpenGL)时,将访问这些值。
由于性能要求,我不愿意使用反射——这是一个合理的不情愿吗?
我有一个解决方案,但我的问题是:“他们是更好或更简单的方法吗?”
这是我当前的解决方案:我将为我想要访问的每种类型的成员变量创建枚举(即,一种用于双精度数,一种用于整数,一种用于字符串,一种用于布尔值等)。我的对象的基类将具有对应于每种变量类型的字典(例如,Dictionary<FieldsForDoubles, double> m_doubleDict)。该基类中的 GetValueOf([some enum value]) 方法将被重载以接受每种类型的枚举并返回适当的数据类型(例如,public double GetValueOf(FieldsForDoubles field))。为方便起见,派生类可以添加实际属性(例如,Latitude 属性),但这些属性只会访问相应的字典。
最后,作为一次短途旅行,我可能会通过字符串值而不是枚举值来访问字典,让GetValueOf 方法使用someEnumValue.ToString() 访问字典并提供一个通用方法(GetVaueOf<type>(string variableName))来允许某些派生类保存不在当前枚举中但可以通过非常相似的模式访问的变量(例如,我可以使用 GetValueOf<double>([some variable name]) 访问任何使用此模式的变量)
任何人都发现这种方法存在问题(例如,访问相当短的字典不是那种费用,对吧?)?关于如何做到这一点还有其他想法吗?
提前致谢。
【问题讨论】:
-
为什么不将所有内容都保存在字典中并使用枚举作为键呢?是否有令人信服的理由证明存在属性?
-
我认为我的标题和描述可能具有误导性。我所说的“属性”实际上只是指类持有的任何变量。如上所述,我目前的想法是按照您的建议使用字典。如果需要,任何相关属性都将由派生类添加以方便访问。
-
所以你想重新发明它而不是使用反射?我不知道反射和使用字典存储值之间的性能差异,但我无法想象会有很大的差距。如果它那么快,那么 .NET 不会在后端这样做吗?
标签: .net reflection properties