как ввести значения для свойства типа string

#.net #string

#.net #строка

Вопрос:

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

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

 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;
  

Комментарии:

1. Каков здесь конечный результат? Почему о проверке не может быть и речи?

Ответ №1:

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

 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 , что запрещено, хотя не совсем понятно, зачем вам нужно наследовать от string . Используйте ваше свойство MyValue в качестве его типа, привяжите cboValues к вашему списку, затем используйте (MyValue)cboValues.SelectedItem вместо SelectedValue для настройки вашего свойства.

Комментарии:

1. Это не сработает. Я не хочу проверять, а хочу ограничить значения.

2. Проверка — это способ ограничения значений. Вы понимаете, что перечисление может содержать любое число, которое может содержать целое число, правильно?

3. @Fer: Тогда вам нужно конкретно указать, чего вы хотите.

4. xixonia: Я знаю, что перечисления являются целыми числами, но с перечислениями код намного более удобочитаем, и если клиентская dll использует мой класс, разработчик будет знать, какое значение должно туда входить. и проверка — ЭТО НЕ то же самое, что ограничение значений. Текстовое поле может принимать числа и целых, но если вы хотите, чтобы пользователь ввел просто число, попробуйте использовать числовое поле. Это просто лучший способ избежать исключений.

5. @Fer: Ваша проблема в том, что «ограничение значений» является расплывчатым и может быть законно истолковано как проверка, поскольку проверка действительно ограничивает значения. Вы на правильном пути, отслеживая свой код; смотрите Мою правку.

Ответ №2:

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

Ответ №3:

В качестве примера:

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