Проверка свойств в c # - PullRequest
       13

Проверка свойств в c #

4 голосов
/ 09 февраля 2011

предположим, что я получил интерфейс и унаследовал от него класс,

internal interface IPersonInfo
{
    String FirstName { get; set; }
    String LastName { get; set; }
}
internal interface IRecruitmentInfo
{
    DateTime RecruitmentDate { get; set; }
}

public abstract class Collaborator : IPersonInfo, IRecruitmentInfo
{
    public DateTime RecruitmentDate
    {
        get;
        set;
    }
    public String FirstName
    {
        get;
        set;
    }
    public String LastName
    {
        get;
        set;
    }
    public abstract Decimal Salary
    {
        get;
    }
}

тогда как мне проверить строки в классе соавтора? Можно ли реализовать внутренние свойства?

Ответы [ 9 ]

5 голосов
/ 09 февраля 2011

Да, но без использования авто-свойств. Вам нужно будет вручную реализовать свойства с помощью вспомогательного поля:

private string firstName;

public String FirstName
{
    get
    {
        return firstName;
    }
    set
    {
        // validate the input
        if (string.IsNullOrEmpty(value))
        {
            // throw exception, or do whatever
        }
        firstName = value;
    }
}
4 голосов
/ 09 февраля 2011

Как то так ...

private string _firstName;
public string FirstName
{
    get
    {
        return _firstName;
    }
    set
    {
        if (value != "Bob")
          throw new ArgumentException("Only Bobs are allowed here!");
        _firstName = value;
    }
}

По сути, для свойств вы используете синтаксическую сахарную версию. Во время компиляции они создают закрытую переменную-член и связывают свойство для использования этой переменной, как я делаю здесь вручную. Точная причина этого в том, что если вы хотите добавить логику, вы можете преобразовать ее в ручную, как у меня здесь, не нарушая реализацию интерфейса.

3 голосов
/ 09 февраля 2011

Следует также упомянуть рамки валидации, если вы становитесь немного сложнее. Они могут значительно упростить управление правилами валидации, а также будут отображать ошибки в вашем пользовательском интерфейсе, сохраняя правила привязанными к вашим моделям, поэтому вам не нужно будет иметь какой-либо повторяющийся стандартный код валидации. В зависимости от версии вашего фреймворка, один из вариантов: Аннотации данных .

2 голосов
/ 09 февраля 2011
2 голосов
/ 09 февраля 2011

Насколько я знаю, если вы используете автоматический синтаксис свойств, вы потеряете возможность доступа к полям поддержки. Согласно документации (http://msdn.microsoft.com/en-us/library/bb384054.aspx):

В C # 3.0 и новее реализовано автоматически свойства делают объявление свойства более лаконично, когда нет дополнительной логики требуется в свойствах доступа. Они также позволяют клиентскому коду создавать объекты. Когда вы объявляете собственность как показано в следующем примере, компилятор создает приват, аноним вспомогательное поле, которое может быть только доступ через собственность получить и установите аксессоры.

Атрибуты разрешены на автоматически реализованные свойства, но очевидно, не на полях поддержки так как те не доступны из ваш исходный код Если вы должны использовать атрибут на вспомогательном поле собственности, просто создайте регулярную свойство.

Итак, ваше единственное решение - создавать обычные свойства.

0 голосов
/ 21 мая 2013

Кроме того, вы не можете использовать типы значений для своих полей.Например, вы можете создать класс «FirstName» со следующей реализацией:

public class FirstName
{
    private string _Value;
    public string Value
    {
        get
        {
            return _Value;
        }
        set
        {
            if (string.IsNullOrEmpty(value))
                throw new ArgumentNullException("Value cannot be null");
            if (value.Length > 128)
                throw new ArgumentOutOfRangeException("Value cannot be longer than 128 characters");
            _Value  = value;
        }
    }

    public FirstName(string initialValue)
    {
        Value   = initialValue; //does validation check even in constructor
    }
}

Наконец, в приведенном выше примере кода вы просто получите:

public interface IPersonInfo
{
    FirstName FirstName { get; set; }
    String LastName { get; set; }
}

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

public FirstName MyFirstName;
var x = MyFirstName.Value;

Если у вас есть много полей, которые вы хотите проверить, это может оказаться громоздким подходом.Однако вы можете обобщить его для обработки определенных типов чисел, таких как положительные числа (ints > 0) или числа (int >= 0), меры и т. Д.

Строки сложнее, поскольку они часто имеют ограничения по длине вдобавление к типам значений (например, без специальных символов, без цифр и т. д.) Это может быть возможно при наличии свойства длины только для чтения, которое устанавливается в конструкторе наследующего класса.

0 голосов
/ 09 февраля 2011

Если вы имеете в виду, можете ли вы выполнять пользовательскую логику во время получения / установки свойства в C #, ответ - да.

Вы используете так называемые автоматические свойства, где резервное хранилище и логика по умолчанию для вас.

Вам просто нужно предоставить его себе как

private int backingStoreVariable;
public property MyProperty
{
    get
    {
        return this.backingStoreVariable;
    }
    set
    {
        this.backingStoreVariable=value;
    }
}

Теперь вы можете запускать пользовательский код проверки в ваших блоках get и set.

0 голосов
/ 09 февраля 2011
private DateTime recruitmentDate;    
public DateTime RecruitmentDate
{
    get { return recruitmentDate; }
    set
    {
        validate(value);
        recruitmentDate = value;
    }
}
0 голосов
/ 09 февраля 2011

Да. Вы можете создать частное поле поддержки для свойства, например:

private String _firstName;

public String FirstName
{
     get
     {
          return _firstName;
     }
     set
     {
          //Check value for correctness here:
          _firstName = value;
     }
}
...