通常将对象转换为“真实”类型

时间:2015-11-23 10:57:41

标签: c# .net generics

我有共享验证逻辑,这在很大程度上取决于自定义属性,所以我需要检查每种类型。

为每个验证订阅者提取一个实例(要检查):

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类型,因此它不包含任何自定义属性(逻辑上),因此我需要将其强制转换为正确的类类型。

实现这一目标的最佳方式是什么?

1 个答案:

答案 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。然而,这取决于您如何设计实体,因此您可以提出更好的解决方案。