/ / how lmitować wartości dla właściwości typu string - .net, string

jak lmitować wartości dla właściwości typu string - .net, string

Mam klasę z właściwością, która zapisuje jakostrunowy. Jednak wartości dla właściwości mogą być tylko z listy wartości, podobnie jak wyliczenie. Jednak ta lista wartości jest ładowana z tabeli odnośników, więc może się różnić, dlatego nie może być wyliczeniem. Mówię o ograniczeniu go w typie właściwości, a nie sprawdzaniu poprawności ani w interfejsie GUI. Jakieś wskazówki, jak to osiągnąć? Z góry dziękuję.

Edycja: jeśli moja lista wartości była znana w czasie projektowania, miałbym wyliczenie jako typ dla mojej własności:

public enum MyValues{val1, val2, val3}

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

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

Jednak ponieważ moje wartości są ładowane z tabeli odnośników w DB, nie mogę używać wyliczeń. EDIT 2: Chciałbym mieć coś takiego:

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;

Odpowiedzi:

2 dla odpowiedzi № 1

Setery właściwości są pełnoprawnymi metodami i możesz wykonać dowolny kod, który Ci się w nich podoba. Na przykład,

private string myProperty;
private HashSet<string> validValues;

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

myProperty = value;
}
}

Jest to oczywiście prosty (i niekompletny) przykład, ale powinien on pokazać, co należy zrobić: w swoim ustawiaku, w jaki sposób potwierdzić, że dostarczona wartość (dostępna w value parametr, który jest niejawny) jest prawidłowy. Jeśli nie jest, wyrzuć wyjątek (ArgumentException to przykład użyty tutaj i jest w porządku, lub możesz rzucić bardziej specyficzny lub znaczący wyjątek). Jeśli tak, ustaw wartość.

Edytuj po edycji pytania

Jedyny poważny problem z twoim kodem polega na tym, że próbujesz odziedziczyć string, co nie jest dozwolone, choć nie jest jasne, dlaczego potrzeba dziedziczyć ze stringów. Wykorzystaj swoją nieruchomość MyValue jako typ, wiąż cboValues do swojej listy, a następnie użyj (MyValue)cboValues.SelectedItem zamiast SelectedValue ustawić swoją własność.


1 dla odpowiedzi nr 2

Możesz wykonać sprawdzenie wartości w ustawiaczu właściwości.


1 dla odpowiedzi nr 3

Jako przykład:

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;
}
}
}