如何在基础 class 上使用泛型时将函数从一个接口应用到另一个接口?

How to apply functions from one interface to another interface while using generics on a base class?

我有两个来自第三方的接口,它们具有相同的功能。由于这是第三方接口,我没有能力附加父接口。

public interface IInterface1 {
     int Open(string stringName);
}

public interface IInterface2 {
     int Open(string stringName);
}

我想将它们传递到基地 class

public class MyClass : BassClass<IInterfaceWithOpenFunction>

这样我就可以在两个 class 上以相同的方式执行完全相同的功能。

public class BassClass<T> Where T : IInterfaceWithOpenFunction, new() 
{
    private T item;
    public BaseClass(string stringName) 
    {
        item = new T();
        item.open(stringName);

我不想让项目动态化,因为我想保留智能感知,我该如何实现?

IInterfaceWithOpenFunction 不知何故需要消耗其他接口的功能打开,同时允许我传入所需的接口来实现。

为了实现这一点,您可以做的是创建自己的 "parent" 接口和派生的 classes,每个都适合那些不同的第三方 classes。本质上,您对不同的非相关接口有不同的包装器:

public interface IInterfaces
{
    int Open(string stringName);
}

public class DerivedForInterface1 : IInterfaces
{
    private IInterface1 _instance;
    public DerivedForInterface1(IInterface1 instance)
    {
        _instance = instance;
    }

    public int Open(string stringName) => _instance.Open(stringName);
}

public class DerivedForInterface2 : IInterfaces
{
    private IInterface2 _instance;
    public DerivedForInterface2(IInterface2 instance)
    {
        _instance = instance;
    }

    public int Open(string stringName) => _instance.Open(stringName);
}

然后是你的基地 class:

public class BassClass<T> Where T : IInterface

在上述实施中,第三方接口的特定实例作为包装器的依赖项提供。通过这样做,IInterfaces 上的实现没有默认构造函数,因此您需要删除 new() 通用约束。还有其他方法可以实现它,例如通过属性而不是构造函数传递依赖项。不同的方式各有利弊,大家可以对照一下。


至于你的这部分代码:

item = new T();
item.open(stringName);

我认为也许您不应该像您正在做的那样初始化类型,您宁愿让 class 持有对已初始化类型的引用。可能是我展示的包装器 classes 可以替换您当前拥有的 BaseClass

如果您坚持使用智能感知和单一管理器来管理它们,那么可以这样做:

public class Provider1Wrapper : IInterfaceWithOpenFunction
{
    private Provider1 _provider; // Instance\Inject via CTOR

    public int Open(string stringName)
    {
        return _provider.Open(stringName);
    }
}

public class Provider2Wrapper : IInterfaceWithOpenFunction
{
    private Provider2 _provider; // Instance\Inject via CTOR

    public int Open(string stringName)
    {
        return _provider.Open(stringName);
    }
}

public static class ProviderManager<T> where T : IInterfaceWithOpenFunction, new()
{
    public static int Open(string stringName)
    {
        T providerWrapper = new T();
        return providerWrapper.Open(stringName);
    }
}


void Main()
{
    var result = ProviderManager<Provider2Wrapper>.Open(stringName);
}