2016-04-04 18 views
0

Ich habe einige wiederholte Teile des Codes. Dies widerspricht dem DRY-Prinzip. Aber ich weiß nicht, wie man dies durch eine generische Methode ersetzt.C# richtigen Weg implementieren generische Methode

class Foo 
{ 
    public bool isFirstAttribHasRightValue; 
    public bool isSecondAttribHasRightValue; 
    private readonly T1 _firstAttrib; 
    private readonly T2 _secondAttrib; 

    public HashSet<T1> relatedToFirstAttrib; 
    public HashSet<T2> relatedToSecondAttrib; 
    ... 

    public C() 
    { ... } 

    public T1 GetFirstAttrib(T3 somevalue) 
    { 
     return (somevalue != othervalue) || isFirstAttribHasRightValue ? _firstAttrib : default(T1); 
    } 

    public T2 GetSecondAttrib(T3 somevalue) 
    { 
     return (somevalue != othervalue) || isSecondAttribHasRightValue ? _secondAttrib : default(T2); 
    } 

    public ClearRelatedToFirst() 
    { 
     isFirstAttribHasRightValue = true; 
     relatedToFirstAttrib.Clear(); 
    } 

    public ClearRelatedToSecond() 
    { 
     isSecondAttribHasRightValue = true; 
     relatedToSecondAttrib.Clear(); 
    } 
    ... 
} 

Ich mag doppelte Methoden ersetzen, wie ClearRelatedToFirst() und ClearRelatedToSecond(), zu ClearRelatedToAttrib<TYPE>(). Und innerhalb dieser generick-Methode weiß ich nicht, wie man wählt, welche bool -Variable ich setzen muss oder welche hashset ich löschen muss. Gleich wie bei anderen doppelten Methoden. Kannst du mir zeigen, wie ich diesen Code umgestalten kann? Danke.

Antwort

1

Siehe Code unten:

class Attribute<T> 
{ 
    public bool isRightValue; 
    public HashSet<T> relatedHashSet; 
    private T _value; 

    public T GetValue(T3 somevalue) 
    { 
     return (somevalue != othervalue) || isRightValue ? _value : default(T); 
    } 

    public Clear() 
    { 
     isRightValue = true; 
     relatedHashSet.Clear(); 
    } 
} 

class Foo 
{ 
    public Attribute<T1> firstAttribute; 
    public Attribute<T2> secondAttribute; 
    ... 

    public Foo() 
    { ... } 
    ... 
} 
+0

Wenn i-Attribut von angeforderten Typ zurückgeben möchten, wie ich Methode implementieren sollte? 'public Attribut GetAttribute (T) {// was sollte da sein? } ' – gek0n