在这种情况下,有没有办法将派生 class 转换为基础 class?

Is there a way to get the conversion of derived class to baseclass work in this case?

我目前有一个问题

我有 1 个接口,有两种类型的参数,像这样

ITestInterface<ArgumentA>
ITestInterface<ArgumentB>

这个接口只有参数不同

我想将此接口传递给 class 的构造函数。像这样的东西

public class MyClass
{
    public ITestInterface<object> MyInterface {get; set;}

    public MyClass(ITestInterface<ArgumentA> testInterfaceA){
    this.MyInterface = testInterfaceA as ITestInterface<object>;
    this.MyTestInterface.SomeEvent += this.OnSubcribe;
    }
    
    public MyClass(ITestInterface<ArgumentB> testInterfaceB){
    this.MyInterface = testInterfaceB as ITestInterface<object>;
    this.MyTestInterface.SomeEvent += this.OnSubcribe;
    }

public void OnSubcribe(){
//Work to do here, dont care about what argument the interface has.
}
}

并调用 MyClass 构造函数,我有这样的东西:

public List<MyClass> ClassList = new();
    
public void testMethod(){
var interA = getInterfaceWithArgumentA();
var myClassA = new MyClass(interA);

var interB = getInterfaceWithArgumentB();
var myClassB = new MyClass(interB);
}

所以问题是我无法将接口参数转换为对象。我也不需要区分论点。我只是想避免拥有 MyInterface 的 2 个属性,例如 (MyInterfaceA, MyInterfaceB)。

我还需要考虑,也许将来我会有更多类型的 Argument,所以可能有多个属性,如 MyInterfaceA、MyInterfaceB、MyInterfaceC 以及每个 Interfaceargument 类型的多个构造函数将是一团糟。

我只是想有一个 Baseclass 和从它派生的 ArgumentA 和 ArgumentB class 这样转换就可以工作,但不是那样的。

我该如何解决这个问题?

非常感谢

我认为您没有提供 getInterfaceWithArgumentB() 和 getInterfaceWithArgumentA() 方法的作用。我几乎没有做任何假设。

要解决您的问题,Generic 会有所帮助。

示例如下

 public class MyClass<T>
{
    public ITestInterface<T> MyInterface { get; set; }

    public MyClass(ITestInterface<T> testInterfaceA)
    {
        this.MyInterface = testInterfaceA;
        this.MyInterface.SomeEvent += MyInterface_SomeEvent;
    }
    private void MyInterface_SomeEvent(object sender, EventArgs e)
    {
        Console.WriteLine(sender);
    }
    
}

public class ArgumentA
{
    public string Name { get; set; }
}

public class ArgumentB
{
    public int Id { get; set; }
}

public interface ITestInterface<T>
{
    T Data { get; set; }

    event EventHandler SomeEvent;
    void OnSomeEvent();
}

public class TestInterface<T> : ITestInterface<T>
{
    public T Data { get ; set; }

    public event EventHandler SomeEvent;

    public void OnSomeEvent()
    {
        if(SomeEvent != null)
        SomeEvent(Data, EventArgs.Empty);
    }
}

您可以像下面这样使用它。

MyClass<ArgumentA> myClass = new MyClass<ArgumentA>(
                                             new TestInterface<ArgumentA>()
                                             {
                                                 Data = new ArgumentA() { Name = "test" }
                                             });
            MyClass<ArgumentB> myClas2 = new MyClass<ArgumentB>(
                                             new TestInterface<ArgumentB>() 
                                             { 
                                                 Data = new ArgumentB() { Id = 10 } 
                                             });

            myClas2.MyInterface.OnSomeEvent();
            myClass.MyInterface.OnSomeEvent();

更新

 class Program
{
    static void Main(string[] args)
    {
       
        ObservableCollection<MyClass> items = new ObservableCollection<MyClass>();
        
        MyClass<ArgumentA> myClass = new MyClass<ArgumentA>(
                                         new TestInterface<ArgumentA>()
                                         {
                                             Data = new ArgumentA() { Name = "test" }
                                         });
        MyClass<ArgumentB> myClas2 = new MyClass<ArgumentB>(
                                         new TestInterface<ArgumentB>() 
                                         { 
                                             Data = new ArgumentB() { Id = 10 } 
                                         });
        items.Add(myClass);
        items.Add(myClas2);
     
        myClas2.MyInterface.OnSomeEvent();
        myClass.MyInterface.OnSomeEvent();

    }
}

public class MyClass
{
    public ITestInterface MyInterface { get; set; }
}

public class MyClass<T> : MyClass
{
    public MyClass(ITestInterface<T> testInterfaceA)
    {
        this.MyInterface = testInterfaceA;
        this.MyInterface.SomeEvent += MyInterface_SomeEvent;
    }
    private void MyInterface_SomeEvent(object sender, EventArgs e)
    {
        Console.WriteLine(sender);
    }

}

public class ArgumentA 
{
    public string Name { get; set; }
}

public class ArgumentB 
{
    public int Id { get; set; }
}
public interface ITestInterface
{
    event EventHandler SomeEvent;
    void OnSomeEvent();
}
public interface ITestInterface<T> : ITestInterface
{
    T Data { get; }
}

public class TestInterface<T> : ITestInterface<T> 
{
    public T Data { get; set; }

    public event EventHandler SomeEvent;

    public void OnSomeEvent()
    {
        if (SomeEvent != null)
            SomeEvent(Data, EventArgs.Empty);
    }
}