我有一个类,其属性保存为字符串。但是,属性的值只能来自值列表,类似于枚举。但是,这个值列表是从查找表中加载的,因此它可能会有所不同,因此它不能是枚举。 我正在谈论限制它的属性类型,而不是验证,也不在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;
答案 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;
}
}
}