2013-07-22 75 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()等)