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驱动程序)
。是的,就是这样。谢谢是的,就是这样。谢谢