我有一个名为Required() : BaseAttribute
的验证属性,我可以使用以下代码跟踪它:( BaseAttribute只实现了IsValid()方法。)
public static String Validate(object Object)
{
StringBuilder builder = new StringBuilder();
if (Object != null)
{
Type ObjectType = Object.GetType();
PropertyInfo[] Properties = ObjectType.GetProperties();
foreach (PropertyInfo Property in Properties)
{
object[] Attributes = Property.GetCustomAttributes(typeof(BaseAttribute), true);
foreach (object Attribute in Attributes)
builder.AppendLine(((BaseAttribute)Attribute).IsValid(Property, Object));
}
}
return builder.ToString();
}
问题是,这有效:
class roh {
[Required()]
public string dah { get; set; }
}
class main {
Console.WriteLine(Validate(new roh()));
}
但这不是:
class fus {
private roh _roh
public roh Roh {
get { if (_roh == null)
_roh = new roh;
return _roh; }
set { _roh = value; }
}
}
class roh {
[Required()]
public string Dah { get; set; }
}
class main {
Console.WriteLine(Validate(new fus()));
}
如何修改我的Validate方法,以便无论对象有多深,它都可以递归方式找到自定义属性?
答案 0 :(得分:2)
您可以使用Microsoft Enterprise Library。它有一些构建在验证块中(类似于你在这里使用的样式)并且支持在对象图中对递归对象进行验证。我相信。
您引用EntLib验证DLL,可以使用内置验证或编写自己的验证。然后,您可以使用简单的Validation.Validate(myObject)
调用验证它。
希望这可能有所帮助:)
答案 1 :(得分:1)
你已经说过了神奇的词 - 递归。对于您访问的每个属性,请在它存储的对象上调用Validate,然后瞧。
一个警告是无限递归 - 如果您的对象图是树,这将正常工作。如果它更复杂,您需要跟踪您已访问过的对象。