如何在c#中使用接口的泛型方法?得到错误

问题描述 投票:-1回答:1

我有两种方法的接口,

我正在尝试创建通用接口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.

        }
    }

}

//很抱歉长时间混淆代码。

c# inheritance polymorphism
1个回答
1
投票

您面临的问题是由IList<T>界面不协变这一事实引起的。真正的意思是,IList<ParentType>不能分配给IList<ChildType>的实例。该文档将帮助您更好地理解该主题。

所以你可以在这里走两条路:

  1. 使用数组可以从隐式引用转换中受益。这里的代码如下: vsObject.Run(context, viewModel.ToArray());
  2. 在代码中切换到IEnumerable<T>所在的协变接口。因此,这将要求您更改ValidationClass.Run方法的签名,如下所示: void Run(CtxNewRelease ctx, IEnumerable<T> entities)

这将使传递的List<SalesForecastViewModel>可分配给IEnumerable<INewReleaseValidationEntity>类型的变量。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.