非静态字段需要对象引用

时间:2012-01-04 14:32:41

标签: c#

我在代码文件的开头使用静态变量,因为我稍后会用它来验证值:

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)。

3 个答案:

答案 0 :(得分:2)

如错误所示:您的Data属性是非静态的。使其静态以在静态上下文中访问它。

但是,由于您的代码段仅引用非静态上下文中的fullNameValue字段,因此您可以将fullNameValue声明为实例变量,并且您的代码可以正常使用。

答案 1 :(得分:1)

您还必须将Data变量设为static。您将fullNameValue声明为static,这意味着您处于静态上下文中,因此无法使用实例变量,因为静态不与该类的任何实例相关联。

答案 2 :(得分:1)

好吧,您可以将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;
    }
}