如何限制string类型的属性的值

时间:2011-04-11 01:32:11

标签: .net string

我有一个类,其属性保存为字符串。但是,属性的​​值只能来自值列表,类似于枚举。但是,这个值列表是从查找表中加载的,因此它可能会有所不同,因此它不能是枚举。 我正在谈论限制它的属性类型,而不是验证,也不在GUI中。 有关如何实现这一目标的任何提示? 提前谢谢。

编辑:如果我在设计时知道我的值列表,我会将枚举作为我的属性的类型:

public enum MyValues{val1, val2, val3}

public class myClass
{
    ...
    public property MyValues myProp{get;set;}
}

...
myClass c1=new myClass();
c1.myProp=MyValues.val3;

但是,当我从DB中的查找表加载我的值时,我无法使用枚举。 编辑2:我想有类似的东西:

public class MyValue:string
{
    public MyValue(string Val):base(val){} //this doesn't exist
}
public class MyValues:List<MyValue>
{
     public static MyValues GetValues()
     {
         //load values from DB;
        //plus All

     }
     public static MyValue ValueAll{get{return new MyValue("All")
}

public class myClass
{
    ...
    public property MyValue myProp{get;set;}
}

...
myClass c1=new myClass();
c1.myProp=MyValues.ValueAll;
//load combo with MyValues.GetValues();
c1.myProp = cboValues.SelectedValue;

3 个答案:

答案 0 :(得分:2)

属性设置器是完整的方法,您可以在其中执行任何您喜欢的代码。例如,

private string myProperty;
private HashSet<string> validValues;

public string MyProperty
{
    get { return myProperty; }
    set
    {
         if(!validValues.Contains(value)) throw new ArgumentException();

         myProperty = value;
    }
}

这显然是一个简单(且不完整)的示例,但它应该演示您需要做什么:在您的setter中,以某种方式验证提供的值(在value参数中可用,这是隐式的)是有效。如果不是,则抛出异常(ArgumentException是此处使用的示例,并且没有问题,或者可以随意抛出更具体或有意义的异常)。如果是,请设置值。

问题编辑后编辑

您的代码唯一真正的问题是您尝试从string继承,但这是不允许的,尽管不清楚为什么需要继承字符串。让您的媒体使用MyValue作为其类型,将cboValues绑定到您的列表,然后使用(MyValue)cboValues.SelectedItem代替SelectedValue来设置您的媒体资源。

答案 1 :(得分:1)

您可以在属性设置器中进行值检查。

答案 2 :(得分:1)

举个例子:

using System.Collections.Generic;

class Foo
{
    HashSet<string> validBars = new HashSet<string>(){"Apple", "Orange", "Banana"};

    string bar = "Apple";
    public string Bar {
        get { return bar; }
        set {
            if(validBars.Contains(value)
                bar = value;
        }
    }
 }