我有一个包含表单的页面的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方法将能够使用该表单的属性。
我正在寻找一些先进的架构或更聪明的东西,而不仅仅是需要不必要的代码。
谢谢
答案 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();
}
}