我有共享验证逻辑,这在很大程度上取决于自定义属性,所以我需要检查每种类型。
为每个验证订阅者提取一个实例(要检查):
var instance = this.ValidationProvider.GetInstanceForSubscriber(validationSubscriber);
其中validationSubscriber
是包含这些值的枚举:
人, 检查
此时,GetInstanceForSubscriber
返回object类型的实例:
public object GetInstanceForSubscriber(ValidationSubscribers validationSubscriber)
{
switch (validationSubscriber)
{
case ValidationSubscribers.Person:
return new Person();
case ValidationSubscribers.Checks:
return new Checks();
default:
return null;
}
}
调用此方法后,我检查类型:
var instanceType = instance.GetType();
然后,我读了(自定义)属性:
var attributes = propertyInfo.GetCustomAttributes(true);
然后我返回一个IEnumerable<PropertyAttribute>
列表,其中只包含我的自定义属性,将验证范围限制为仅需要(这是因为这个问题并不十分相关)。
问题
由于instance
属于object类型,因此它不包含任何自定义属性(逻辑上),因此我需要将其强制转换为正确的类类型。
实现这一目标的最佳方式是什么?
答案 0 :(得分:3)
我建议通过介绍界面来修改你的设计。
public interface ICustomAttribute
{
IEnumerable<PropertyAttribute> GetCustomAttributes(true);
}
class Person:ICustomAttribute
{
IEnumerable<PropertyAttribute> GetCustomAttributes(true)
{
//Validation logic here for Person entity.
//Encapsulate your entity level logic here.
return propertyInfo.GetCustomAttributes(true);
}
}
class Check:ICustomAttribute
{
IEnumerable<PropertyAttribute> GetCustomAttributes(true)
{
//Validation logic here for CHECK entity
//Encapsulate your entity level logic here.
return propertyInfo.GetCustomAttributes(true);
}
}
public ICustomAttribute GetInstanceForSubscriber(ValidationSubscribers validationSubscriber)
{
//Use dependency injection to eliminate this if possible
switch (validationSubscriber)
{
case ValidationSubscribers.Person:
return new Person();
case ValidationSubscribers.Checks:
return new Checks();
default:
return null;
}
}
现在,当您从此方法收到对象时,您将始终拥有正确的对象。
var instanceType = instance.GetCustomAttributes(true); //will give you all attributes
您可以利用泛型类型进一步增强此逻辑。见this。然而,这取决于您如何设计实体,因此您可以提出更好的解决方案。