我有一堆从第三方应用程序包装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);
}
}
实际上,方法主体更大。问题是这里有很多重复。
IComInteropObjectA
和IComInteropObjectB
共享许多相同的方法。我的目标是通过将ComInterop对象共享的方法移到BaseWrapper
类来消除某些重复。
我设法做到了,例如GetRow
中的BaseWrapper
:
protected internal object[] GetRow(dynamic obj, int i)
{
return obj.GetRow(i);
}
我可以通过传递a
或b
从派生类中调用它。但是,使用dynamic
有严重的缺点(至少让我担心,但仍然很重要:它使我的汇编速度变慢),如果可能的话,我希望避免使用它。
我的问题:是否有一种无需使用dynamic
关键字即可实现这一目标的方法?我试图使用泛型,但失败了,我什至不确定泛型的概念在这里是否适用。
我不完全确定这是您要寻找的内容,尽管将generic和constraining设置为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);