Generyczna metoda dla niepowiązanych ze sobą interfejsów

0

Mam dwa niepowiązane ze sobą interejsy

public interface A
    {
        void MyMethod(string arg1);
    }

    public interface B
    {
        void MyMethod(string arg1);
    }

Chcę teraz stworzyć metodę genereczna która wywoła odpowiednią metodę z interfejsu A albo B.

public void CallMyMethod<T>(T myObject, string arg) where T : A,B
        {
            myObject.MyMethod(arg);
        }

Problem polega na tym że kompilator nie wie, czy chodzi o interejs A czy B. Czy jest sposób by to zrobić generycznie czy muszę dwie oddzielne metody stworzyć?

Błąd kompilatora:

The call is ambigous between the following methods or properties: 'A.MyMethod(string)' and 'B.MyMethod(string)'
0

https://pl.wikipedia.org/wiki/Adapter_(wzorzec_projektowy)

lub brzydko:

(myObject as dynamic).MyMethod(arg);

lub:

switch (myObject) {
	case A a: a.MyMethod(arg); break;
	case B b: b.MyMethod(arg); break;
};
1

Jeśli to są takie same metody to czemu nie można jej przenieśc do Interfacu bazowego? I metoda generyczna przyjmowala by ten interface bazowy

1

wiesz no, pohackować się da aby to działało, ale mi to wygląda na złą abstrakcje/hierarchie

co chcesz osiągnąć?

public void CallMyMethod<T>(T myObject, string arg) where T : A, B
{
    if (myObject is A a)
    {
        a.MyMethod(arg);
    }

    if (myObject is B b)
    {
        b.MyMethod(arg);
    }
}
2

Problemem jest że tak naprawdę obiekt może implementować oba te interfejsy na raz:

	public class Test: A, B
	{
		void A.MyMethod(string arg1)
		{
			Console.WriteLine("A!");		
		}
		
		void B.MyMethod(string arg1)
		{
			Console.WriteLine("B!");		
		}	
	}

i co teraz ma zrobić ta biedna funkcja?

var obj = new Test();
(obj as A).MyMethod(null); // wypisze A!
(obj as B).MyMethod(null); // wypisze B!

coś nie poszło już krok wcześniej że doszło do tej sytuacji. Jeśli masz obiekty z różnych źródeł to moim zdaniem prawidłowym rozwiązaniem jest użycie adaptera i dopasowanie interfejsów

1 użytkowników online, w tym zalogowanych: 0, gości: 1