我有一个人和一个组织实体: 人看起来像这样:
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类,如下所示,在一个地方进行所有验证,我想传递Class(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完成,我也希望这是通用的,所以我可以将它用于我的所有实体。
任何Suggesstions?
答案 0 :(得分:2)
我强烈建议采用另一种方式,因为你的设计会让你更难改变你的课程。要更改类,您必须更新不同类中的验证方法,以及参数的枚举。
更好的方法是在Rule Violation教程中设置NerdDinner方案。
答案 1 :(得分:0)
我同意C. Ross;你需要大量的反思来使这个工作,并没有编译时间支持所以永远。以这种方式构建它需要花费大量时间并且需要花费大量时间来维护。
您最好使用验证框架,Mattias也建议。有几个框架可供选择。我个人是Microsoft Enterprise Library Validation Application Block(VAB)的粉丝,但它有一个陡峭的学习曲线。另一个不错的选择是.NET 3.5 DataAnnotations,它具有更少的功能,但更容易学习。
如果您对VAB感兴趣,我建议您先下载Hands On Lab并阅读随附的ValidationHOL.pdf教程。它给出了VAB可以实现的良好印象。我写了很多关于将VAB与ADO.NET Entity Framework集成的文章。您可以开始阅读here。
祝你好运答案 2 :(得分:0)
企业库验证非常好。我会推荐它。 如果你想为一个小项目做一些轻量级的事情,那么就是一个解决方案:
您将不得不使用反射,但让我们看看如何以最简单的方式实现这一目标......
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");
}
}