首页 > 解决方案 > 通用接口实现混乱

问题描述

我在接口实现方面有点混乱,我所有尝试的“修复”似乎使整个解决方案更加复杂和破碎。我敢肯定有一个简单的答案,但我现在看不到它!

我有这两个接口(第二个用于第一个的列表):

public interface IUserDefinedListEditViewModel<T> where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>
{
    string TypeName { get; set; }
    IList<T> UserDefinedListEntries { get; set; }
}

public interface IUserDefinedListEntryEditViewModel<T> where T : IBaseUserDefinedListModel
{
    string Display { get; set; }
    T UserDefinedListEntry { get; set; }
}

我有第三个接口,它由几个不同的类实现:

public interface IBaseUserDefinedListModel
{
    Guid Id { get; set; }
    string Name { get; set; }
    bool IsSystem { get; set; }
}

以下是我的(不正确的)实施尝试:

public class APEditViewModel : IUserDefinedListEditViewModel<APEntryEditViewModel>
{
    public string TypeName { get; set; }
    public IList<APEntryEditViewModel> UserDefinedListEntries { get; set; } = new List<APEntryEditViewModel>();
}

public class APEntryEditViewModel : IUserDefinedListEntryEditViewModel<APModel>
{
    public string Display { get; set; }
    public APModel UserDefinedListEntry { get; set; }
}

public class BaseUserDefinedListModel : IBaseUserDefinedListModel
{
    public Guid Id { get; set; }
    [Required(ErrorMessage = "The Name field is required.")]
    public string Name { get; set; }
    public bool IsSystem { get; set; }
}

public class APModel : BaseUserDefinedListModel
{
    public string NewValue { get; set; }
}

我目前遇到的主要错误是在 APEditViewModel 中,这是(减少的)错误:

The type 'APEntryEditViewModel' cannot be used as type parameter 'T' in the
generic type or method 'IUserDefinedListEditViewModel<T>'. There is no 
implicit reference conversion from 'APEntryEditViewModel' to 
'IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>'.

我不确定我是否需要这种级别的通用接口,但从我的研究和实验来看,我相信我需要。我只是还没到那里,我认为IUserDefinedListEditViewModel需要类型接口(IUserDefinedListEntryEditViewModel)中的类型的接口似乎是错误的。

对不起,我没有让自己说清楚,解释起来很棘手,因为我不确定我哪里出错了,所以任何问题我都会尝试回答/更新我的问题。

标签: c#genericsinterface

解决方案


IUserDefinedListEditViewModel将您的界面更改为:

public interface IUserDefinedListEditViewModel<T1,T2> 
           where T1 : IUserDefinedListEntryEditViewModel<T2> 
           where T2 : IBaseUserDefinedListModel

之后,更新实现APEditViewModel

public class APEditViewModel : IUserDefinedListEditViewModel<APEntryEditViewModel, APModel>

该错误表明具有通用约束

where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>

只有 IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>实现此接口的类型才会被接受为T. 如果您希望任何IBaseUserDefinedListModel在 的类型参数中被接受T,您还需要将其设为泛型。


推荐阅读