Замените Dynami c универсальными при использовании ComInterop - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть куча классов, которые обертывают объект 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? Я пытался использовать дженерики и потерпел неудачу, я даже не уверен, что концепция дженериков здесь применима.

...