2016-07-26 65 views
-1

我使用一類具有以下成員變量如何在C#中保存成員變量的選擇?

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」的結構?

+0

看看裝飾設計模式。 –

+0

如果效率不是很大的問題,你總是可以使用反射。 – Jashaszun

+0

關於Stack Overflow有很多問題討論在運行時以編程方式選擇和訪問對象成員。在您的具體示例中,使用反射或製作訪問者代表詞典可能是適當的,但用這種含糊不清的問題不可能知道。請提供一個很好的[mcve],清楚地顯示你的場景,解釋你已經研究過的具體技術,以及你在實施一個或多個這些技術時遇到的具體問題。 –

回答

0

你可以使用委託...

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; 
    } 
} 
0

然而,這似乎是非常低效的。在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; 
} 
0

我會使用擴展名。它有效嗎?這是主觀的,直到它比較某種東西。但它是可讀的,這很重要。如果你的邏輯很簡單,並且有人出現並且發現它是以錯綜複雜的方式完成的,那麼首先他們會多次閱讀它,假設他們必須缺少某些東西。然後,當他們意識到它正在做一些簡單的事情時,他們可能會想知道爲什麼沒有簡單地做。

重構代碼時會發生這種情況。我們遇到了一些複雜的東西(甚至可能是我們寫的和忘記的東西),當我們理解它時,我們會對自己說:「它就是這樣嗎?」然後用簡單的東西代替它。

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);