Проверка атрибута сущности C # - PullRequest
1 голос
/ 03 марта 2010

У меня есть лицо и организация: Человек выглядит так:

public class PersonEntity
{
public string FirstName {get;set;}
public string LastName {get;set;}

public bool IsValid(PersonEnum Attribute, string AttributeValue)
{
if(attribute == PersonEnum.FirstName && AttributeValue == null)
return false;
if(attribute == PersonEnum.LastName && AttributeValue == null)
return false;

return true;
}
}

У меня есть PersonEnum // Создан только для поддержки метода IsValid.

public enum PersonEnum
{
FirstName, LastName
}

Аналогично Организация имеет Сущность и Перечень.

Я хочу создать класс Helper следующим образом, чтобы все проверки были в одном месте, я хочу передать имя класса (Entity), его члена (Enum) и значение:

public class Helper
{
//Not sure how to pass A Class def and an attribute. 
public static ValidateEntityAttribute(*[EntityEnum]*,*[EntityEnum]*, Value)
{
.. do something that looks at the Entity and call it's IsValid method.
}
}

Можно ли это сделать без использования Reflection, я также хочу, чтобы это было общим, чтобы я мог использовать его для всех своих сущностей.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

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

Один из лучших способов сделать это - настроить схему Нарушение правил , как это сделано в учебнике NerdDinner .

0 голосов
/ 04 марта 2010

Проверка Enterprise Library действительно хороша. Я буду рекомендовать это. Если вы хотите сделать что-то легкое для небольшого проекта, вот решение:

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

public class Helper 
{
public static ValidateEntityAttribute(Type objectType, Enum objectEnum, object Value) 
{ 
if(objectType.GetMethod("IsValid", BindingFlags.NonPublic).Invoke(null, BindingFlags.NonPublic, null, new object[{objectEnum, Value}], null))
throw new Exception("Invalid entry");
} 
}
0 голосов
/ 03 марта 2010

Я согласен с К. Россом; вам нужно много размышлений, чтобы заставить это работать и не иметь никакой поддержки времени компиляции, чем когда-либо. На его создание уходит много времени и много времени на его обслуживание.

Вам лучше использовать платформу валидации, как предполагает Маттиас. Есть несколько рамок на выбор. Я лично являюсь поклонником блока приложения проверки корпоративной библиотеки Microsoft (VAB), но у него крутая кривая обучения. Другим хорошим вариантом является .NET 3.5 DataAnnotations, который имеет меньше функций, но легче в освоении.

Если вы заинтересованы в VAB, я бы посоветовал вам начать с загрузки Hands On Lab и прочтения учебного пособия ValidationHOL.pdf, которое прилагается к нему. Это дает хорошее представление о том, чего можно достичь с помощью VAB. Я написал несколько статей об интеграции VAB с ADO.NET Entity Framework. Вы можете начать читать здесь .

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...