非静态字段需要对象引用
本文关键字:对象引用 字段 静态 | 更新日期: 2023-09-27 18:19:30
我在代码文件的开头使用静态变量,因为我稍后会使用它来验证值:
static string fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(Data["FirstName"] ));
public void FillName() {
Pages.SitecoreCMS.Field_Company.Text = fullNameValue;
}
// break.............
public void VerifyingFullName() {
Assert.IsTrue(ArtOfTest.Common.CompareUtils.StringCompare(Pages.Contact.FrameContentIFrame.SitecoreTentativeaccountnameText.Text,fullNameValue, ArtOfTest.Common.StringCompareType.Contains));
}
编译失败:非静态字段、方法或属性"ArtOfTest.WebAii.Design.BaseWebAiiTest.Data.get"需要对象引用
我应该如何更改此代码?我以前使用过非静态变量,但我不能通过其他方法(例如VerifyingFullName)使用它。
正如错误所说:您的Data
属性是非静态的。将其设置为静态,以便在静态上下文中访问它。
但是,由于您的代码片段仅在非静态上下文中引用fullNameValue
字段,因此您可能可以将fullNameValue声明为实例变量,这样您的代码就可以了。
您可以将fullNameValue字段修改为以下代码。我想这会解决你的错误。
问题似乎是fullNameValue字段的初始化代码引用了Data属性(Data["FirstName"]
),但Data是实例属性,而不是静态属性,因此不能在静态上下文中引用它(即初始化静态字段时)。
static object _syncLock = new object();
static string _fullNameValue;
string fullNameValue
{
get
{
lock (_syncLock)
{
if (_fullNameValue == null)
{
_fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(Data["FirstName"]));
}
return _fullNameValue;
}
}
}
看起来您正在将其用于单元测试目的。在这种情况下,在我看来,这段代码将为fullNameValue生成一个值,并将在所有测试用例中重用它。
如果这是你想要的,那么这也没关系。然而,我的猜测是,如果你开始为不同的测试使用不同的测试数据,你可能会发现这个代码的行为不正确,尽管我不熟悉ArtOfTest框架。如果这会给您带来麻烦,那么您可能需要重新考虑_fullNameValue字段是否应为static
。
或者,如注释中所讨论的,可以将fullNameValue字段设置为非静态字段,然后在构造函数中对其进行初始化。以下是代码:
string fullNameValue;
string companyValue;
public PricingForm()
{
fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(Data["FirstName"]));
companyValue = // code to initialize company value
}
还有另一种选择:您可能需要尝试将fullNameValue字段转换为属性。同样,这可能会产生与上述示例不同的行为。即使输入参数相同,对GenerateUniqueId的每次调用是否都返回不同的值?这意味着每次访问此属性时,都会返回不同的值,因此请考虑这是否是您想要的。
string fullNameValue
{
get { return UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(this.Data["FirstName"])); }
}
根据评论中的讨论,我的建议是使用以下方法。
这将执行_fullNameValue字段的延迟初始化(这似乎是必要的,因为BaseWebAiiTest类的Data属性在构造函数执行时没有初始化)。我省略了锁定代码,因为它可能没有必要,并且OP对它的冗长性表示担忧
string _fullNameValue;
string fullNameValue
{
get
{
if (_fullNameValue == null)
_fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(this.Data["FirstName"]));
return _fullNameValue;
}
}
您还必须将Data
变量作为static
。您将fullNameValue
声明为static
,这意味着您处于静态上下文中,因此不能使用实例变量,因为static与类的任何实例都不关联。