将许多不同的类传递给一个方法C#

时间:2017-05-05 12:45:06

标签: c#

你好,我有以下方法:

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驱动程序的实例传递给我们将要使用的类的构造函数。

1 个答案:

答案 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()对您的两个类执行完全相同的操作)。
但除非我弄错了,否则你会失去像我在我的例子中所使用的干净的无参数构造函数。