将接口强制转换为类

本文关键字:转换 接口 | 更新日期: 2023-09-27 18:31:36

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

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

谢谢

将接口强制转换为类

>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();
    }
}

你听说过演员表(原样,原样)吗?强制转换和类型转换(C# 编程指南)

并且您类 SampleFormHandler 尚未实现 IEligibilityValidation

无论如何((IEligibilityValidation)this)。IsValid() you solution

更新:

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

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