2016-07-07 81 views
0

鑑於字典喜歡收集有以下類:創建使用常量字符串字段可能的字符串值重複

class A 
{ 
    [CustomAttribute(1)] 
    public const string X = "x"; 

    [CustomAttribute(2)] 
    public const string Y = "y"; 

    [CustomAttribute(3)] 
    public const string Z = "z"; 
} 

class B 
{ 
    [CustomAttribute(4)] 
    public const string P = "p"; 

    [CustomAttribute(5)] 
    public const string Q = "q"; 

    [CustomAttribute(6)] 
    public const string Z = "z"; 
} 

注意Z常數,它有不同的CustomAttribute參數的重複。

我想,使用反射,迭代的類和生產類字典收集與以下屬性:

dict.CustomGet(A.Z) == 3 
dict.CustomGet(B.Z) == 6 

現在,我知道,我可以很容易做到:

dict.CustomGet(()=>A.Z) 

實現爲:

public int CustomGet(Expression<Func<string>> expr){...} 

,並使用Expression對象來找出我正在訪問哪個課程和字段,並且有內部集合,如Dictionary<Type,Dictionary<string,int>>或甚至可能是Dictionary<FieldInfo,int>,但它要求我每次寫出可疑的()=>Class.ConstantName

請注意,我無法將字符串文字值更改爲唯一。

以上就是我目前的問題,我覺得的問題是:我可以用另一種方式表達比告訴C#中的唯一對象傳遞給CustomGet代替非唯一字符串?

附註:我想比較通過的字符串的引用,但由於實習,我認爲很有可能"z"ReferenceEqual另一個"z"

最後一點:這主要是爲了好玩,我可以(並且很可能會)完全避免這個問題,但我想知道C#的限制是供將來參考:)

回答

0

張貼我有一個想法之後,但我不是100%確信它有多好:

修改類看起來像這樣:

class A 
{ 
    [CustomAttribute(1)] 
    public readonly MyCustomString X = "x"; 

    [CustomAttribute(2)] 
    public readonly MyCustomString Y = "y"; 

    [CustomAttribute(3)] 
    public readonly MyCustomString Z = "z"; 
} 

然後創建類型:

public class MyCustomString 
{ 
    private readonly string _value; 
    public static implicit operator MyCustomString(string str) 
    { 
     return new MyCustomString{_value=str;}; 
    } 
    public static implicit operator string(MyCustomString mcs) 
    { 
     return mcs._value; 
    } 
} 

現在,當通過像CustomGet(A.X)我可以只使用傳遞的對象(public int CustomGet(MyCustomString mcs);),因爲它將被視爲不同,即使它擁有相同_value

這是多麼瘋狂/不好?

0

子類化字符串可能是最好的方法。它確保每個實例都是唯一的,並且可以獨一無二地比較,而不用擔心碰撞。您需要使MyCustomString中的_value字符串不是隻讀的,因爲它需要寫在對象初始化上。

如果您想進一步「擴展」它,您可以將類本身傳遞到MyCustomString初始化中。

如:

public readonly MyCustomString Z = new MyCustomString(A.class, "Z"); 

這樣,你可以做兩個MyCustomString實例之間的完全平等的操作。您還需要重寫MyCustomString中的GetHashCode函數以使您的類可以正常使用Dictionary類(more detail here

相關問題