带OR约束的泛型类型属性

时间:2013-07-22 10:53:15

标签: c# .net generics

是否可以使用类型无关的属性类,可能用'where或'约束装饰?

示例:

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 个答案:

答案 0 :(得分: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;
   }
}

答案 1 :(得分:0)

您可以创建抽象属性和所需的实现。 然后可以按要求的方式处理每个属性。 (转换为属性),但不能创建不受支持的类型的属性。

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()等)