0

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

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

提前致谢。

4

2 回答 2

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

于 2012-06-15T18:32:36.483 回答
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(key);

于 2012-06-15T14:55:56.053 回答