将接口转换为类?

时间:2013-09-16 11:16:13

标签: c# asp.net-mvc-4 reflection interface

我有一个包含表单的页面的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方法将能够使用该表单的属性。

我正在寻找一些先进的架构或更聪明的东西,而不仅仅是需要不必要的代码。

谢谢

2 个答案:

答案 0 :(得分:0)

你听说过演员(as,是)吗? Casting and Type Conversions (C# Programming Guide)

你的SampleFormHandler类没有实现IEligibilityValidation

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

更新:

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

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

答案 1 :(得分: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();
    }
}