C#泛型工厂方法未按预期调用构造函数

C#泛型工厂方法未按预期调用构造函数,c#,inheritance,constructor,C#,Inheritance,Constructor,因此,我有一个继承自Page(第二个后代:CreationDialog:MainPage:Page)的类型,该类型具有无参数构造函数。我在PageFactory类中有一个静态泛型工厂方法: public static class PageFactory { public static T GetInstance<T>(WebDriver driver) where T : Page, new() { T page = new T {

因此,我有一个继承自
Page
(第二个后代:
CreationDialog:MainPage:Page
)的类型,该类型具有无参数构造函数。我在
PageFactory
类中有一个静态泛型工厂方法:

public static class PageFactory
{
    public static T GetInstance<T>(WebDriver driver) where T : Page, new()
    {

        T page = new T
        {
            Driver = driver
        };
        return page;
    }
}

public class Page 
{
public static T GetInstance<T>() where T : Page, new()
    {
        return PageFactory.GetInstance<T>(Utils.GetCurrentDriver());
    }
}

public class CreationDialog : MainPage, IModal
{
   public CreationDialog()
    {
        IModal _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}
公共静态类PageFactory
{
公共静态T GetInstance(WebDriver驱动程序),其中T:Page,new()
{
T页=新的T页
{
司机
};
返回页面;
}
}
公共类页面
{
公共静态T GetInstance(),其中T:Page,new()
{
返回PageFactory.GetInstance(Utils.GetCurrentDriver());
}
}
公共类CreationDialog:主页,IModal
{
公共创意对话
{
IModal _Modal=Modal.Get(WindowLocator);
}
IModal_模态{get;set;}
}
Modal.Get(WindowLocator)
是一个带有静态参数的静态方法

问题是-当我调用
GetInstance()
时,我最终没有初始化
\u Modal
,并且在以后调用
\u Modal
中的方法时出现空引用异常

调试器显示,当调用get实例时,类型参数是相应的
CreationDialog
,那么它为什么不调用自己的构造函数呢?我错过了什么

更新:已到达
CreationDialog
构造函数中的断点,但在构造函数返回方法范围后
页面
变量设置为
null
,并且仅使用
驱动程序对其进行初始化


在这个主题上,我可以读谁的书,因为我似乎不能正确地获得构造函数和继承

您将两次声明_Modal,一次作为局部变量,一次作为属性。您正在为变量赋值,要设置属性的值,只需删除类型声明即可

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}

您将两次声明_Modal,一次作为局部变量,一次作为属性。您正在为变量赋值,要设置属性的值,只需删除类型声明即可

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}

问题是本地范围与成员范围。更改此项:

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        IModal _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}
为此:

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        _Modal = Modal.Get(WindowLocator);  //Don't declare new variable
    }

    IModal _Modal { get; set; }
}
尽管这会更好:

public class CreationDialog : MainPage, IModal
{
    protected readonly IModal _modal;

    public CreationDialog()
    {
        _modal = Modal.Get(WindowLocator);  //Don't declare new variable
    }

    public IModal Modal
    {
        get { return _modal; }
    }
}

问题是本地范围与成员范围。更改此项:

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        IModal _Modal = Modal.Get(WindowLocator);
    }

    IModal _Modal { get; set; }
}
为此:

public class CreationDialog : MainPage, IModal
{
    public CreationDialog()
    {
        _Modal = Modal.Get(WindowLocator);  //Don't declare new variable
    }

    IModal _Modal { get; set; }
}
尽管这会更好:

public class CreationDialog : MainPage, IModal
{
    protected readonly IModal _modal;

    public CreationDialog()
    {
        _modal = Modal.Get(WindowLocator);  //Don't declare new variable
    }

    public IModal Modal
    {
        get { return _modal; }
    }
}

你确定没有调用构造函数吗?您的代码可能正在运行构造函数,但是
\u Modal
被设置为null。你在构造函数中设置了断点来确认它没有被调用吗?@Amy有办法检查吗?我似乎无法从调试器中获得编译器通过
newt
的确切含义。您可以通过在构造函数中设置断点并运行它来检查编译器是否达到断点。或添加日志记录语句
newt()
只调用构造函数。我认为
Modal.Get(WindowLocator)
返回
null
,您得出了错误的结论。@艾米检查了,这很奇怪。当我在构造函数中设置断点时,它已经到达了,但是当我将该范围返回到
GetInstance
时,方法页面再次设置为
null
。事实上,我现在真的迷路了。将更新问题。谢谢。你能告诉我们你在哪里调用
GetInstance
,你说你正在使用
GetInstance()
,但是你已经给了我们
GetInstance(WebDriver驱动程序)
的代码。你确定没有调用构造函数吗?您的代码可能正在运行构造函数,但是
\u Modal
被设置为null。你在构造函数中设置了断点来确认它没有被调用吗?@Amy有办法检查吗?我似乎无法从调试器中获得编译器通过
newt
的确切含义。您可以通过在构造函数中设置断点并运行它来检查编译器是否达到断点。或添加日志记录语句
newt()
只调用构造函数。我认为
Modal.Get(WindowLocator)
返回
null
,您得出了错误的结论。@艾米检查了,这很奇怪。当我在构造函数中设置断点时,它已经到达了,但是当我将该范围返回到
GetInstance
时,方法页面再次设置为
null
。事实上,我现在真的迷路了。将更新问题。谢谢。你能告诉我们你在哪里调用
GetInstance
,你说你正在使用
GetInstance()
,但是你给了我们
GetInstance(WebDriver驱动程序)
。是的,就是这样。谢谢是的,就是这样。谢谢