使用ComInterop时用泛型替换动态

问题描述 投票:0回答:1

我有一堆从第三方应用程序包装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
{
    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
{
    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);
    }
}

实际上,方法主体更大。问题是这里有很多重复。

IComInteropObjectAIComInteropObjectB共享许多相同的方法。我的目标是通过将ComInterop对象共享的方法移到BaseWrapper类来消除某些重复。

我设法做到了,例如GetRow中的BaseWrapper

protected internal object[] GetRow(dynamic obj, int i)
{
    return obj.GetRow(i);
}

我可以通过传递ab从派生类中调用它。但是,使用dynamic有严重的缺点(至少让我担心,但仍然很重要:它使我的汇编速度变慢),如果可能的话,我希望避免使用它。

我的问题:是否有一种无需使用dynamic关键字即可实现这一目标的方法?我试图使用泛型,但失败了,我什至不确定泛型的概念在这里是否适用。

c# generics com-interop
1个回答
0
投票

我不完全确定这是您要寻找的内容,尽管将genericconstraining设置为BaseWrapper,看起来像这样

protected internal object[] GetRow<T>(T source, int i) 
   where T : BaseWrapper 
{
    return source.GetRow(i);
}

用法

var wrapperA = ...;

var asd = GetRow(wrapperA,2);

如果要输入结果,则>

protected internal TResult[] GetRow<T,TResult>(T source, int i) 
   where T : BaseWrapper
{
    return source.GetRow(i).ToArray<TResult>();
}

用法

var wrapperA = ...;

var asd = GetRow<WrapperA,string>(wrapperA,2);
© www.soinside.com 2019 - 2024. All rights reserved.