2011-02-09 2 views
3

давайте предлагаем получил интерфейс и наследовать класс от него,Проверяющих свойства в C#

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

затем Как проверить строки в классе соавтора? Возможно ли реализовать внутренние свойства?

ответ

4

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

private string firstName; 

public String FirstName 
{ 
    get 
    { 
     return firstName; 
    } 
    set 
    { 
     // validate the input 
     if (string.IsNullOrEmpty(value)) 
     { 
      // throw exception, or do whatever 
     } 
     firstName = value; 
    } 
} 
+0

Избито на 23 секунды :) – GWLlosa

0

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

private String _firstName; 

public String FirstName 
{ 
    get 
    { 
      return _firstName; 
    } 
    set 
    { 
      //Check value for correctness here: 
      _firstName = value; 
    } 
} 
0
private DateTime recruitmentDate;  
public DateTime RecruitmentDate 
{ 
    get { return recruitmentDate; } 
    set 
    { 
     validate(value); 
     recruitmentDate = value; 
    } 
} 
2

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

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

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

Итак, ваше единственное решение - создать регулярные свойства.

0

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

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

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

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

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

3

Что-то вроде этого ...

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

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

2

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

0

В качестве альтернативы вы не можете использовать типы значений для своих полей. Например, вы можете создать класс «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; } 
} 

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

public FirstName MyFirstName; 
var x = MyFirstName.Value; 

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

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

Смежные вопросы