将接口强制转换为类
本文关键字:转换 接口 | 更新日期: 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();
}