[编辑删除了我需要访问.net属性(副成员变量)]
的含义我正在尝试使用.net(在C#编码为特定的WPF)创建一个设计模式,通过该模式,类的实例(从基类派生)具有可以通过传递枚举值来访问的成员变量方法调用。例如,myObject.GetValueOf(dimensionFields.Latitude)
将返回myObject持有的“Latitude”值。显然,目的是在运行时使用GetValueOf([some enum variable])
来访问由枚举定义的任何字段值中的任何一个。我还需要相当高的性能,因为当许多(很容易超过100,000个)对象被绘制到显示器(通过OpenGL)时,将访问这些值。
由于性能要求,我不愿意使用反射 - 这是一种合理的不情愿吗?
我有一个解决方案,但我的问题是:“他们是一个更好或更简单的方式吗?”
这是我目前的解决方案:我将为我想要访问的每种类型的成员变量创建枚举(例如,一个用于双精度,一个用于整数,一个用于字符串,一个用于bool等)。我的对象的基类将具有与每种类型的变量对应的字典(例如,Dictionary<FieldsForDoubles, double> m_doubleDict
)。将重载该基类中的GetValueOf([some enum value])
方法以接受每种类型的枚举并返回适当的数据类型(例如,public double GetValueOf(FieldsForDoubles field)
)。派生类可以为方便起见添加实际属性(例如,Latitude
属性),但这些属性只会访问相应的字典。
最后,作为一个游览,我可以通过字符串值而不是枚举值来访问字典,让GetValueOf
方法使用someEnumValue.ToString()
访问字典并提供泛型方法({ {1}})允许某些派生类在当前枚举中保存变量,但可以使用非常相似的模式访问(例如,我可以使用GetVaueOf<type>(string variableName)
来访问使用此模式的任何变量)
任何人都会看到这种方法的问题(例如,访问相当短的词典不是那么费用,对吧?)?关于如何做到的任何其他想法?
提前致谢。
答案 0 :(得分:0)
如果我离开,请告诉我,我会删除。为什么数据需要是属性,枚举和字典?为什么不只是像vcsjones的评论中的字典?您从属性开始,然后参考字段“字段值的数量”。目前尚不清楚你想要什么。您是否计划在运行时构建枚举和属性 - 如果是这样,您打算如何做到这一点?
可能的简化方法。
public class dynamicClass
{
public Dictionary<string, string> DicString { get; private set; }
public Dictionary<string, Int32> DicInt32 { get; private set; }
public string GetStringFromKey(string key) { return DicString[key]; }
我没有看到GetStringFromKey给表带来了什么。
在客户端DicString [key];与GetStringFromKey(键);
答案 1 :(得分:0)
(首先,不回答) 就个人而言,我会努力开发一种方法来重建反射。直接属性引用总是更快,因为它们保存内存地址。任何类型的重定向或查找总是会更加昂贵。
(这是一个答案) 显然我们不了解您的要求或系统,所以这是一个想法。如果您的属性是在枚举中定义的,那么理论上它们不是在运行时创建的。因此,为什么不使用数组呢?如果你有
enum
prop1 = 0
prop2 = 1
prop3 = 2
然后您需要的是一个长度为3的数组。当用户传递枚举时,将其用作数组的索引。
编辑:如果性能是你的主要驱动程序,那么你需要为每种类型的变量创建一个不同的枚举,这样你的数组就可以“强烈”地键入(非对象)。然后,您需要为每种类型使用不同的功能。所以:
enum intProp
prop1 = 0
prop2 = 1
prop3 = 2
enum floatProp
prop1 = 0
prop2 = 1
prop3 = 2
int[] intVals
float[] floatVals
fun int getIntProp(intProp p)
return intVals[(int)p]
fun float getFloatProp(floatProp p)
return floatVals[(int)p]
它不漂亮,但它应该足够快以处理100,000个对象。不幸的是,我们必须经常平衡性能和可维护性。这是一个丑陋的代码,但很好的整洁代码几乎总是会带来性能损失。
如果你想要真正的闪电性能,最好的办法是使用C ++并直接管理地址。