使用带有泛型的接口类型作为容器类型将实现的实例映射到字典

问题描述

出发点是我有一个带有 2 个实现的泛型接口:

界面:

let run = await element[0].$('div>div>div>span')
let run = await element[0].$('div>span')

实现:

interface IFoo<T,U>
{
    U Method1(T item);
    T Method2(U id);
}

有了这个出发点,假设我得到了每个可用实现类型的实例,我想将每个实例映射到字典中,分别访问相应的 public class Type1 { } public class Implementation1 : IFoo<Type1,int> { public int Method1(Type1 item) { throw new NotImplementedException(); } public Type1 Method2(int id) { throw new NotImplementedException(); } //.... public int Method3() { int myReturnedInt = 0; //.... return myReturnedInt; } public void Method4() { } } public class Type2 { } public class Implementation2 : IFoo<Type2,int> { public int Method1(Type2 item) { throw new NotImplementedException(); } public Type2 Method2(int id) { throw new NotImplementedException(); } public int Method3() { int myReturnedInt = 0; //.... return myReturnedInt; } public void Method4() { } } Method3 ,所以我试过:

对泛型的类型和抽象进行分组:

Method4

填写字典:

public interface IContainerInterface : IFoo<Type1,int>,IFoo<Type2,int>
    {
        int Method3();
        void Method4();
    }

但是不起作用。尽管 public enum EnumType { type1,type2 } Implementation1 type1Instance; Implementation2 type2Instance; private Dictionary<EnumType,IContainerInterface> _container; void Main(string[] args) { _container = new Dictionary<EnumType,IContainerInterface>{ {EnumType.type1,type1Instance as IContainerInterface},{EnumType.type2,type2Instance as IContainerInterface} }; } 可用,但字典中的值为空。 一个没有泛型的工作示例将是 this 问题的答案,即在不涉及泛型的情况下实现从接口到实现的绑定,但如何使用接口中的泛型实现这一点?

我的目标是能够像这样分别访问类型的方法

Implementation1Instance

编辑:

更正通读中的所有错别字并找到完整的编译片段(不要执行,但能够理解并遵循我试图解释的问题):

//for type1
int myInt = _container[EnumType.type1].Method3();
_container[EnumType.type1].Method4();
//for type2
int myInt = _container[EnumType.type2].Method3();
_container[EnumType.type2].Method4();

解决方法

如果您在这里尝试做的是定义一个接口来以多态方式保存这些类型,并且您能够定义一个提供所有必需功能的完全工作的非通用接口,那么您以错误的方式重新处理这个问题。

而不是写这个完全错误、容易出错和短视的怪物(当你需要更多类型时会发生什么,不管它们是什么?你为哪个接口实现同名函数?等等):

interface IContainerInterface: IFoo<Type1,int>,IFoo<Type2,int>

您应该做的是在继承树的最根部定义一个 IContainerInterface,然后从中派生出 IFoo<>。您的字典初始化和使用保持不变,您不再需要每次需要新类型时更改界面。

接口的所有实现不贴

当然,前提是您可以从代码中提取非通用接口。这是任何人的猜测,因为您当然根本不提供相关和/或正确的代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...