如何在C#中保存对成员变量的选择?

如何在C#中保存对成员变量的选择?,c#,reference,C#,Reference,我正在使用一个包含以下成员变量的类 class SomeClass { int idx0_value; int idx1_value; int idx2_value; //... } 我不能改变这个班的结构 我正在使用此类的一个实例来对照以前选择的索引进行检查,并使用一些if-else语句为变量指定相应的值: if(indexIFoundEarlier == 0) valueIWant = aSomeClass.idx0_value;

我正在使用一个包含以下成员变量的类

class SomeClass
{
    int    idx0_value;
    int    idx1_value;
    int    idx2_value;

    //...
}
我不能改变这个班的结构

我正在使用此类的一个实例来对照以前选择的索引进行检查,并使用一些
if-else
语句为变量指定相应的值:

if(indexIFoundEarlier == 0)
    valueIWant = aSomeClass.idx0_value;
else if(indexIFoundEarlier == 1)
    valueIWant = aSomeClass.idx1_value;
else
    valueIWant = aSomeClass.idx2_value;
这似乎相当低效

<>在C++中,我可以有效地存储一个引用给相关成员,但是在C语言中这是不可能的,我已经阅读了关于这个的各种线程。
有没有更好的(阅读效率更高)方法来缓存我所做的选择而不改变“SomeClass”的结构?

您可以使用委托

class SomeClass {

   int idx0_value;
   int idx1_value;
   int idx2_value;

   private Func<int> selection;

   private void SetSelection( int choice ) {
      switch( choice ) {
      case 0:
         selection = () => idx0_value;
         break;
      case 1:
         selection = () => idx1_value;
         break;
      case 2:
         selection = () => idx2_value;
         break;
      }
   }

   private int GetSelectionAgain() {
      return selection?.Invoke() ?? -1;
   }
}
class-SomeClass{
int idx0_值;
int idx1_值;
int idx2_值;
私有函数选择;
私人选举(整数选择){
开关(选择){
案例0:
选择=()=>idx0_值;
打破
案例1:
选择=()=>idx1_值;
打破
案例2:
选择=()=>idx2_值;
打破
}
}
private int GetSelectionAgain(){
返回选择?.Invoke()??-1;
}
}
然而,这似乎相当低效。在C++中,我可以有效地 存储对相关成员的引用,但在C#中不是 可能的话,我已经读过这方面的各种线索

这不是低效的,在我看来,使用switch语句将是您在这种情况下唯一合理的选择。使用反射或任何类型的委托的开销都比只执行
if-else
语句或
switch
语句要高得多

//same concept as what you posted but as a switch statement
switch( indexIFoundEarlier ) 
{
  case 0:
     valueIWant = idx0_value;
     break;
  case 1:
     valueIWant = idx1_value;
     break;
  default:
     valueIWant  = idx2_value;
     break;
}

我会用分机。效率高吗?这是主观的,直到它与某些东西相比较。但它是可读的,这很重要。如果你的逻辑这么简单,有人发现它是以一种复杂的方式完成的,首先,他们会读几遍,假设他们肯定遗漏了什么。然后,当他们意识到这是在做一些简单的事情时,他们可能会想为什么不简单地做

在重构代码时,这种情况经常发生。我们遇到了一些复杂的事情(甚至可能是我们写下并忘记的事情),当我们理解它时,我们会对自己说,“它就是这么做的吗?”然后用更简单的东西代替它

public static class SomeClassExtensions
{
     public static int GetValueFromIndex(this SomeClass someClass, int index)
     {
         if(index == 0) return someClass.idx0_value;
         if(index == 1) return someClass.idx1_value;
         return someClass.idx2_value;
     }
}

var value = aSomeClass.GetValueFromIndex(indexIFoundEarlier);

看看decorator设计模式。如果效率不是一个大问题,那么您可以始终使用反射。关于堆栈溢出,有很多问题讨论在运行时以编程方式选择和访问对象成员。在您的特定示例中,使用反射或制作访问器委托的字典可能是合适的,但这样一个措辞模糊的问题是不可能知道的。请提供一个很好的例子,清楚地展示您的场景,解释您已经研究过的具体技术,以及您在实现一种或多种技术时遇到的具体问题。不要开玩笑-您不是通过将其存储在
valueIWant
中来“缓存选择”吗?