DataAnnotations WriteOnly, если свойство == ноль - PullRequest
1 голос
/ 15 августа 2011

У меня есть следующее свойство:

public virtual String Firstname { get; set; }

и я хочу только иметь возможность записи в поле, ЕСЛИ оно в настоящее время равно нулю (не задано), этого можно достичь с помощью DataAnnotations?

Ответы [ 3 ]

4 голосов
/ 15 августа 2011

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

private string _firstName;

public string FirstName
{
    get 
    {
        return _firstName;
    }
    set
    {
        if (_firstName != null) throw ...
        _firstName = value;
    }
}

Если под аннотациями данных вы просто подразумеваете атрибуты, то ответ таков: это может быть достигнуто с помощью атрибутов, НО вам нужно что-то, что будет реализовывать некоторую логикусвязанные с атрибутом.Обычно это делается с помощью Аспектно-ориентированного программирования (AOP), где вы создаете атрибут маркера, который будет использоваться некоторым сложным API.API на основе этого атрибута обернет ваш класс пользовательским кодом, добавив оператор if во время компиляции (например, PostSharp) или во время выполнения (например, Unity, Spring.NET).

1 голос
/ 15 августа 2011

Другой способ добиться этого, по моему более изящному, - не реализовывать set для свойства, а только get

приватную строку _firstName;

public string FirstName
{
    get 
    {
        return _firstName;
    }

}

и иметьфункция:

public void SetFirstName(string FirstName) 
{
   _firstName = FirstName;
}

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

По моему мнению, API вашего объекта будет таким понятным и понятным.

С уважением.

0 голосов
/ 19 мая 2015

Существует также специальный синтаксис DataAnnotation для достижения этой цели:

[DisplayFormat(NullDisplayText = "some string")]
public virtual String Firstname { get; set; }
...