2009-11-09 2 views
6

мне интересно, если C# поддерживает дополнительные свойства, как следующийC# необязательные свойства в C# 3.0 (2009)

public class Person 
{ 
    public string Name { get; set;} 
    public optional string NickName { get; set;} 
    ...many more properties... 
} 

так, что когда я создаю объект Person можно легко проверить правильность ввода значений в простом петля

public bool IsInputOK(Person person) 
{ 
    foreach(var property in person.GetType().GetProperties()) 
    { 
     if(property.IsOptional()) 
     { 
      continue; 
     } 
     if(string.IsNullOrEmpty((string)property.GetValue(person,null))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

Я искал в google, но не получил желаемого решения. Действительно ли мне нужно вручную передать код проверки кода для каждого свойства?

Спасибо.

+3

Я думаю, что это ужасный способ выполнения проверки объекта. Это пахнет ... –

+0

Я думал, что это лучший способ :(... Я могу сэкономить около 100 строк повторяющегося кода, используя этот подход. Хотя я согласен, что производительность немного повредит, используя отражение. –

+2

для разработки запаха? –

ответ

22

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

[AttributeUsage(AttributeTargets.Property, 
       Inherited = false, 
       AllowMultiple = false)] 
internal sealed class OptionalAttribute : Attribute 
{ 
} 

public class Person 
{ 
    public string Name { get; set; } 

    [Optional] 
    public string NickName { get; set; } 
} 

public class Verifier 
{ 
    public bool IsInputOK(Person person) 
    { 
     foreach (var property in person.GetType().GetProperties()) 
     { 
      if (property.IsDefined(typeof(OptionalAttribute), true)) 
      { 
       continue; 
      } 
      if (string.IsNullOrEmpty((string)property.GetValue(person, null))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

Вы также можете взглянуть на Validation Application Block, который имеет такие же возможности, из коробки.

+0

Это быстро, именно то, что я ищу. Большое спасибо. –

2

У C# нет «необязательного» ключевого слова, и, как говорит @Mitch Wheat, это ужасный способ выполнить проверку.

Почему вы не можете сделать валидацию в настройщике свойств?

+0

Потому что независимо от того, какую проверку я поставил в сеттер. Я бы не смог проверить данные, если сеттер не вызван вообще :) –

0

Если вы хотите пометить реквизиты атрибутами и не сворачивать свой собственный код проверки, почему бы не попробовать систему проверки?

http://www.codeplex.com/ValidationFramework

+0

Поскольку структура моей маленькой задачи, похоже, немного переборщила. Я проверю это, когда у меня будет время. Спасибо за ввод. –