c# - 通用接口实现混乱
问题描述
我在接口实现方面有点混乱,我所有尝试的“修复”似乎使整个解决方案更加复杂和破碎。我敢肯定有一个简单的答案,但我现在看不到它!
我有这两个接口(第二个用于第一个的列表):
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
)中的类型的接口似乎是错误的。
对不起,我没有让自己说清楚,解释起来很棘手,因为我不确定我哪里出错了,所以任何问题我都会尝试回答/更新我的问题。
解决方案
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
,您还需要将其设为泛型。
推荐阅读
- python - 如何在beautifulsoup findAll中的类之间使用OR运算符?
- arrays - 在 ColdFusion 中是否可以将数组传递给自定义标签?
- ansible - ansible中的模板是幂等的吗?
- multithreading - 如何防止在 FOR 循环中切换线程,同时使用 omp 指令
- ios - react-native-permissions 意外令牌失败 - 在 ios 上构建时
- c# - 如何将字典作为数据源绑定到 ListBox 并覆盖 displayMember 的默认 ToString() 以显示项目?
- c# - AutoMapper 9 映射嵌套表
- batch-file - 试图在我的批处理文件名中获取前几天的日期
- git - 将 Git 配置为使用本地配置文件而不是漫游配置文件
- javascript - 难以通过路由传入的参数与 reddit 应用程序一起出现在反应中