0

我有一个包含表单的页面的 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;
    }
}

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

这个想法是不同的 FormHandler 将分配给它们不同的 Validation 类,并且在调用 IsValid 方法时将能够使用该表单的属性。

我正在寻找一些高级架构或更智能的东西,而不仅仅是需要不必要的代码。

谢谢

4

2 回答 2

0

你听说过 cast (as, is) 吗? 类型转换和类型转换(C# 编程指南)

而且您的 SampleFormHandler 类还没有实现 IEligibilityValidation

无论如何 ((IEligibilityValidation)this).IsValid() 你的解决方案

更新:

因此,您必须创建要在其上执行 IsValid 的类型的实例。所以

var desiredInstance = Activator.CreateInstance(desiredType);
var validationDesired = desiredInstance as IEligibilityValidation;
if(validationDesired  != null){
validationDesired.IsValid();
}
于 2013-09-16T11:21:25.373 回答
0

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();
    }
}
于 2013-09-16T11:38:01.147 回答