你好,我有以下方法:
db.collection.aggregate([
{$addFields: {quarters: {$objectToArray: "$quarters"}}},
{$unwind:"$quarters"},
{$addFields:{quarters: {"$arrayToObject":{$zip:{inputs:[["$quarters.k"], ["$quarters.v"]]}}}}},
{$addFields:{"quarters.name": "$name"}},
{$replaceRoot:{newRoot:"$quarters"}}
])
我想结合这两个方法并将类作为参数传递,并将它们移动到一个新类,该类将由上面列出的类继承。我需要访问类的一些方法,并确保调用构造函数。我试图像下面那样使用create instance激活器,但不认为我正在使用它。
public EventItemPage LaunchItemsActionByRowIndex(int RowIndex)
{
// does some other stuff
var eventItemPage = new EventItemPage(driver);
eventItemPage.WaitForPageToLoad();
return eventItemPage;
}
public StandardSalesforcePage LaunchViewActionByRowIndex(int RowIndex, string actionItem)
{
// Does the same as above method
var bookDetailPage = new StandardSalesforcePage(driver);
bookDetailPage.WaitForPageToLoad();
return bookDetailPage;
}
我一直在研究很多但是如果这是可能的话,我很困惑。我上面没有提到我们将selenium驱动程序的实例传递给我们将要使用的类的构造函数。
答案 0 :(得分:1)
按照你的要求做并不是不可能的,但是你需要稍微改变你的课程的工作方式。
您不能在类上强制使用带参数的构造函数,但可以强制它具有无参数构造函数:
public T LaunchFooByRowIndex<T>(int RowIndex, string actionItem = String.Empty) where T : IFoo, new()
{
// does some other stuff
T myObject = new T();
myObject.LoadDriver(driver);
myObject.WaitForPageToLoad();
return myObject;
}
请注意,我使第二个参数成为可选项,以使两个方法签名兼容。
通过提及new()
,您确保只能使用具有无参数构造函数的类(并且还实现IFoo
)。处理泛型类型时,可以调用无参数构造函数(假设您需要它存在)。
但您需要按如下方式设置课程:
public interface IFoo
{
void LoadDriver(Driver driver);
void WaitForPageToLoad();
}
public class MyFooClass : IFoo
{
//parameterless constructor exists implicitly,
//UNLESS you have defined constructors with parameters.
//In that case, you need to explicitly make a parameterless constructor.
//and then you implement your interface methods here
}
<强>附录强>
还有其他方法可以做到这一点。
您可以使用继承而不是接口。这允许您为共享逻辑实现单个实现(例如,如果WaitForPageToLoad()
对您的两个类执行完全相同的操作)。
但除非我弄错了,否则你会失去像我在我的例子中所使用的干净的无参数构造函数。