C# 如何初始化具有另一个接口类型aguments的接口
我遇到了一个问题——这是我的班级结构C# 如何初始化具有另一个接口类型aguments的接口,c#,C#,我遇到了一个问题——这是我的班级结构 public interface IModel{} public interface IGenericMapper<T> where T : IModel {...} public class ActualModel:IModel {...} public class ActualMapper: IGenericMapper<ActualModel> {...} 显然,当泛型类型在“out”处声明时,您不能将其作为输入参数 I
public interface IModel{}
public interface IGenericMapper<T> where T : IModel {...}
public class ActualModel:IModel {...}
public class ActualMapper: IGenericMapper<ActualModel> {...}
显然,当泛型类型在“out”处声明时,您不能将其作为输入参数
IGenericMapper<out T>
IGenericMapper
以支持您的场景,但这会应用其他限制
只需IGenericMapper
!=<代码>iEnergicMapper即使实际模型:IModel
在大多数情况下,有一个非泛型的基本接口是有意义的。例如,请参见IList
,它实现了IList
然后,您可以选择在实现上显式实现接口成员。请参见List.GetEnumerator():IEnumerable
不要在假设可以消除任何地方的强制转换的情况下使用泛型。我已经试过了,C#根本没有这方面所需的功能
我建议使用
IGenericMapper
接口作为IGenericMapper
的基本接口,然后在IGenericMapper
上执行您的通用代码,最后(此时您已经拥有了该类型)将它转换回特定的类型。非常确定,在这里,随着通用更改,您将进入共变的领域
试试这个:
public interface IModel{}
public interface IGenericMapper< out T> where T : IModel{}
public class ActualModel : IModel{}
public class ActualMapper : IGenericMapper<ActualModel> {}
您可以添加ILFFMapper的定义吗?
var ILFFMapper
这是一个语法错误,请删除var
关键字您需要一个共变类型。尝试IGenericMapperActualMapper
是IGenericMapper
不是IGenericMapper
因此结果为空抱歉,我将实际代码转换为问题的通用代码-已修复
T GetModel(busO bBusinessObject);
busO SetBusObject(T source, busO target);
IGenericMapper<out T>
public interface IModel{}
public interface IGenericMapper< out T> where T : IModel{}
public class ActualModel : IModel{}
public class ActualMapper : IGenericMapper<ActualModel> {}
IGenericMapper<IModel> blah = new ActualMapper();
IGenericMapper<ActualModel> blah = new ActualMapper();
interface IGenericMapper<out TModel, in TKeyOrIdent>
TModel GetModel(TKeyOrIdent bBusinessObject);
void SetModel(object model, TKeyOrIdent target);