У меня есть куча классов, которые обертывают объект ComInterop из стороннего приложения. Ниже псевдокод иллюстрирует установку
class BaseWrapper : IBaseWrapper
{
// some classes that derived classes must implement
public abstract object[] GetRow(int i);
public abstract string Foo(string s)
public abstract string Bar(int i, string s)
}
class WrapperA : BaseWrapper
{
ExternalComApp.IComInteropObjectA a = ..some COM object A..
public override object[] GetRow(int i)
{
return a.GetRow(i).ToArray<object>();
}
public override string Foo(string s)
{
return a.Foo(s);
}
public override string Bar(int i, string s)
{
return a.Bar(i, s);
}
public string JustInA()
{
return a.MethodX();
}
}
class WrapperB : BaseWrapper
{
ExternalComApp.IComInteropObjectB b = ..some COM object B..
public override object[] GetRow(int i)
{
return b.GetRow(i).ToArray<object>();
}
public override string Foo(string s)
{
return b.Foo(s);
}
public override string Bar(int i, string s)
{
return b.Bar(i, s);
}
}
В действительности, тела метода больше. IComInteropObjectA
и IComInteropObjectB
поставляются сборкой ComInterop, с которой я разговариваю. Проблема в том, что здесь много повторений.
IComInteropObjectA
и IComInteropObjectB
используют несколько идентичных методов. Моя цель - устранить некоторые повторения, переместив методы, которые объекты ComInterop совместно используют, в класс BaseWrapper
.
Мне удалось это сделать, например, для GetRow
в BaseWrapper
:
protected internal object[] GetRow(dynamic obj, int i)
{
return obj.GetRow(i);
}
Я могу вызвать это из производных классов, передав либо a
, либо b
. Однако использование dynamic
имеет серьезные недостатки (наименьшее из моих беспокойств, но все же важно: оно замедляет сборку), и я хотел бы избежать этого, если это возможно.
Мой вопрос: есть ли способ достичь это без использования ключевого слова dynamic
? Я пытался использовать дженерики и потерпел неудачу, я даже не уверен, что концепция дженериков здесь применима.