我有两种方法的接口,
我正在尝试创建通用接口INewReleaseValidationRule,其中T:INewReleaseValidationEntity将具有Run()方法。
然后我有另一个类ValidationClass,它继承了NewReleaseValidationEntityBase类。我试图调用SomeOtherClass中的ValidateInputMethod()中的Run()方法。但是我收到了错误,
**无法从System.Collections.Generic.List转换为System.Collections.Generic.IList ** SalesForecastViewModel是INewReleaseValidationEntity的间接派生类,因此根据运行时多态性它应该有效吗?
public interface INewReleaseValidationRule<T> where T : INewReleaseValidationEntity
{
void Run(CtxNewRelease ctx, IList<T> entities);
string GetMessage(string messageName, string fallbackMessage);
}
public interface INewReleaseValidationEntity
{
string GetDefaultSkipMsg();
List<ValidationError> ValidationErrors {get;set;}
bool Valid { get; set; }
void SetValidation(string errorCode, string errorMessage, string errorField, Severities severity);
}
public abstract class NewReleaseValidationEntityBase : INewReleaseValidationEntity
{
public NewReleaseValidationEntityBase()
{
Valid = true;
}
//Implementation all the methods of INewReleaseValidationEntity
}
public class ValidationClass : NewReleaseValidationEntityBase
{
public ValidationClass()
{
MessageHelper.LoadToCache(TYPECODE);
}
public string GetMessage(string messageName, string fallbackMessage)
{
return MessageHelper.TryGetFromCache(messageName, fallbackMessage);
}
public void Run(Context.CtxNewRelease context, IList<INewReleaseValidationEntity> sList)
{
//Some code statement to perform validation
}
}
然后我查看继承的模型类,
public class SalesForecastViewModel : NewReleaseValidationEntityBase
{
//Some properties and functions
}
然后在另一个类中,我试图调用泛型方法Run(),
Public Class SomeOtherClass {
public void ValidateInput(List<SalesForecastViewModel> viewModel)
{
ValidationClass vcObject = new ValidationClass();
**vcObject.Run(context, viewModel);** //Here viewModel is of child class. It should convert it runtime.
}
}
}
//很抱歉长时间混淆代码。
您面临的问题是由IList<T>
界面不协变这一事实引起的。真正的意思是,IList<ParentType>
不能分配给IList<ChildType>
的实例。该文档将帮助您更好地理解该主题。
所以你可以在这里走两条路:
vsObject.Run(context, viewModel.ToArray());
IEnumerable<T>
所在的协变接口。因此,这将要求您更改ValidationClass.Run
方法的签名,如下所示:
void Run(CtxNewRelease ctx, IEnumerable<T> entities)
这将使传递的List<SalesForecastViewModel>
可分配给IEnumerable<INewReleaseValidationEntity>
类型的变量。
希望这可以帮助。