使用枚举访问.net中的对象成员变量值

时间:2012-06-15 14:38:07

标签: .net reflection properties

[编辑删除了我需要访问.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)来访问使用此模式的任何变量)

任何人都会看到这种方法的问题(例如,访问相当短的词典不是那么费用,对吧?)?关于如何做到的任何其他想法?

提前致谢。

2 个答案:

答案 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 ++并直接管理地址。