как lmit значения для свойства типа строка - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть класс со свойством, которое сохраняется как строка.Однако значения для свойства могут быть только из списка значений, аналогичных перечислению.Однако этот список значений загружается из справочной таблицы, поэтому он может варьироваться, поэтому он не может быть перечислением.Я говорю об ограничении его в типе свойства, а не в валидации или в графическом интерфейсе.Есть ли намеки на то, как этого добиться?Заранее спасибо.

Редактировать: Если бы мой список значений был известен во время разработки, я бы использовал перечисление в качестве типа для моего свойства:

public enum MyValues{val1, val2, val3}

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

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

Однако в качестве моих значенийзагружаются из таблицы поиска в БД, я не могу использовать перечисления.РЕДАКТИРОВАТЬ 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 ]

2 голосов
/ 11 апреля 2011

Установщики свойств являются полноценными методами, и вы можете выполнять любой код, который вам нравится в них. Например,

private string myProperty;
private HashSet<string> validValues;

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

         myProperty = value;
    }
}

Это, очевидно, простой (и неполный) пример, но он должен продемонстрировать, что вам нужно сделать: в вашем установщике как-то проверить, что предоставленное значение (доступное в параметре value, которое неявно) является допустимым. Если это не так, сгенерируйте исключение (ArgumentException - это пример, используемый здесь, и это нормально, или не стесняйтесь сгенерировать более конкретное или значимое исключение). Если это так, установите значение.

Редактировать после вопроса Редактировать

Единственная реальная проблема с вашим кодом заключается в том, что вы пытаетесь наследовать от string, что недопустимо, хотя не совсем понятно, почему вам нужен для наследования от строки. Сделайте так, чтобы ваше свойство использовало MyValue в качестве типа, свяжите cboValues с вашим списком, затем используйте (MyValue)cboValues.SelectedItem вместо SelectedValue для установки вашего свойства.

1 голос
/ 11 апреля 2011

Как пример:

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;
        }
    }
 }
1 голос
/ 11 апреля 2011

Вы можете проверить значение в установщике свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...