2013-07-22 79 views
1

是否有可能具有類型無關的屬性類,可能用'where或'約束脩飾?具有OR約束的泛型類型屬性

例子:

public class Attribute<T> where T: string || bool { 

    public const char ATTRIBUTE_CHAR = 'a'; 

    public string Key { get; set; } 
    public T  Value { get; set; } 

    public Attribute(string key, T value) { 
     Key = key; 
     Value = value; 
    } 

    public Attribute(string key, bool value = true) 
    : base(key, value) {} 

    public Attribute(string key, string value) 
    : base(key, value) {} 

    public override string ToString() { 

     if(typeof(value) == bool && (bool)value) 
      return String.Format({0}={1}, 
       ATTRIBUTE_CHAR, key); 
     else return String.Format({0}={1}:{2}, 
      ATTRIBUTE_CHAR, key, (string)value); 
    } 

} 

這樣的:

Attribute<bool> BoolAttr1  = new Attribute<bool>("bool_1"); 
Attribute<bool> BoolAttr2  = new Attribute<bool>("bool_2", false); 
Attribute<string> StringAttr1 = new Attribute<string>("string_1", "val1"); 
Attribute<string> StringAttr2 = new Attribute<string>("string_2", "val2"); 

...everything.ToString(); 

將產生如下輸出

a=bool_1 
a=string_1:val1 
a=string_2:val2 

但這樣的事情是永遠不可能的:

Attribute<int>... 
+2

你能澄清屬性類的目的嗎? – daryal

+0

@daryal在庫中解析並提供類似下面的內容:'a = recvonly CRLF a = rtpmap:99 h263-1998/90000'這裏有兩種類型的屬性,一種是布爾值(只有一個鍵'啓用'屬性,如果它是假的,它不會出現在消息中),一個是字符串(一個關鍵'rtpmap'和一個值'99 h263 ...) – Atrotygma

+1

爲什麼你需要泛型?您在「屬性」類中沒有任何共同邏輯。泛型的whhole點是以同樣的方式處理不同類型的對象。如果你需要像if(typeof(T)== bool)這樣的行,那麼它就是一個信號,你做錯了。並回答你的問題 - 不,沒有'或'。 –

回答

4

沒有or。你可能想要做的是:

interface IKeyValue<TKey, TValue> 
{ 
    public TKey Key {get;set;} 
    public TValue Value {get;set;} 
} 

public class Attribute : IKeyValue<string, string> 
{ 
    public override string ToString() 
    { 
     return String.Format("{0}={1}:{2}", Constants.ATTRIBUTE_CHAR, Key, Value); 
    } 
} 

public class BoolAttribute : IKeyValue<string, bool> 
{ 
    public override string ToString() 
    { 
     return Value ? String.Format("{0}={1}", Constants.ATTRIBUTE_CHAR, Key) : String.Empty; 
    } 
} 
0

你可以創建一個抽象屬性和你需要的實現。每個屬性然後可以以所需的方式處理。 (Casting to Attribute),但不能創建不支持的類型的屬性。

public abstract class Attribute<T> 
{ 
    public abstract T getValue(); 
} 

public class StringAttribute : Attribute<String> 
{ 
    String value; 

    public String getValue(){ 
     return value; 
    } 

} 

public class BooleanAttribute : Attribute<Boolean> 
{ 
    Boolean value; 

    public Boolean getValue() 
    { 
     return value; 
    } 
} 

此外,這允許您實現非常容易的類型依賴屬性函數。 (如toString()等)