铸造界面一类?(Cast interface to a class?)

2019-11-02 11:50发布

我有一个包含表单页面的CMS。

我想在CMS中有不同的类名称的下拉全部实现验证接口。

我的表单处理含有我想验证对所选择的验证类的工艺方法。

所以我有这个接口:

public interface IEligibilityValidation
{
    bool IsValid();
}

并且例如这个类

public class ComplexEligibilityValidation : IEligibilityValidation
{
    public bool IsValid()
    {
        return true; /* complex logic here */
    }
}

public class SimpleEligibilityValidation : IEligibilityValidation
{
    public bool IsValid()
    {
        return true; /* less complex logic here */
    }
}

然后,我有表单处理程序,可用于验证读取选定的类名。

我不确定我的处理程序是否应该实施IEligibilityValidation也还是我可以使用反射莫名其妙调用的类。

例如:

public class SampleFormHandler : IEligibilityValidation
{
    public SimpleFormHandler(FormViewModel model, INode node)
    {
        this.model = model;
        this.node = node;

        eligiblityValidationClass = GetPropertyValue("eligibilityValidation");

    }

    public SampleProcessResult Process()
    {
            if (!string.IsNullOrEmpty(eligiblityValidationClass))
            {
                var thisType = Type.GetType(eligiblityValidationClass);
                var thisInstance = Activator.CreateInstance(thisType);
                var isValid = ((IEligibilityValidation)thisInstance).IsValid();
                /* Works however, I need the IsValid to have access to a the FormHandler's properties and injected services */
            }

    }

    public bool IsValid()
    {
        /* Will Always be ignored */
        return true;
    }
}

什么是做这样的事情最优雅的方式?

这个想法是不同的FormHandlers都会有不同的验证类分配给他们,并调用时IsValid的方法将能够使用该表单的属性。

我找了一些先进的架构或更聪明的东西不仅仅需要不必要的代码。

谢谢

Answer 1:

SampleFormHandler不应该实现的接口。 如果我理解正确你的设计,你需要创建动态确定类型的实例,然后把对象的IEligibilityValidation接口。

public SampleProcessResult Process()
{
    if (eligiblityValidationClass != Guid.Empty)
    {
        Type validatorType = Type.GetTypeFromCLSID(eligiblityValidationClass);
        IEligibilityValidation validator;
        try
        {
            validator = Activator.CreateInstance(validatorType) as IEligibilityValidation;
        }
        catch (COMException)
        {
            // The class doesn't exist, or instance failed to be created
            // for some other reason.
        }

        if (validator == null)
        {
            // The class exists, but it doesn't implement the interface.
        }

        bool isValid = validator.IsValid();
    }
}


Answer 2:

你听说过投(如,是)? 铸造和类型转换(C#编程指南)

你类SampleFormHandler还没有实现IEligibilityValidation的

反正((IEligibilityValidation)本).IsValid(),您的解决方案

更新:

所以,你必须创建类型的实例要上执行的IsValid。 所以

var desiredInstance = Activator.CreateInstance(desiredType);
var validationDesired = desiredInstance as IEligibilityValidation;
if(validationDesired  != null){
validationDesired.IsValid();
}


文章来源: Cast interface to a class?