1

我有 3 个类,都继承自一个基类“A”,所以我称它们为 A1、A2、A3。从'B'继承的另外3个类,称为B1,B2,B3。现在我创建了 3 种方法来完成相同的工作,如下所示:

List<A1> Do(List<B1>);
List<A2> Do(List<B2>); 
List<A3> Do(List<B3>);

它们具有相同的逻辑和代码,唯一的区别是 3 类的不同新方法:

B1 b = new B1(...) in method 1
B2 b = new B2(...)  in method 2 
B3 b = new B3(...)  in method 3.

那么有人可以帮我弄清楚如何从这三种方法中通用一种方法吗?

我需要添加一些关于 B1 构造函数的内容,因为我使用了多个构造函数,所以事情变得更加复杂,有些是这样的:

B1(A1, int)

有些是这样的:

B1(A1) 
4

2 回答 2

1

这完全取决于Bx构造函数的外观。我的第一个猜测是

public List<TOutput> Do<TInput, TOutput>(
    List<TInput> input, 
    Func<..., TOutput> outputCreator)

进而

var a1 = Do(b1, (...) => new B1(...));

所以这里的主要问题是...零件应该是什么。

于 2013-03-18T08:48:20.473 回答
0

您可以将委托传递给方法来确定正在创建的对象的确切类型,如下所示:

List<AX> Do<AX,BX>(List<BX> b, Func<AX,int?,BX> make) where AX : A, BX : B {
    ...
}

现在您可以为您的make参数传递一个 lambda,如下所示:

var listB2 = new List<B2>();
var res = Do(listB2, (a, num) => num.HasValue ? new B2(a, num.Value) : B2(a));
于 2013-03-18T08:49:44.417 回答