Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非静态字段需要对象引用_C# - Fatal编程技术网

C# 非静态字段需要对象引用

C# 非静态字段需要对象引用,c#,C#,我在代码文件的开头使用静态变量,因为我稍后会使用它来验证值: static string fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(Data["FirstName"] )); public void FillName() { Pages.SitecoreCMS.Field_Company.Text = fullNameValue; } // break............. publi

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

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

您还必须将
数据
变量设置为
静态
。您正在将
fullNameValue
声明为
static
,这意味着您处于静态上下文中,因此无法使用实例变量,因为static与类的任何实例都没有关联。

您还必须将
数据
变量声明为
static
。您正在将
fullNameValue
声明为
static
,这意味着您处于静态上下文中,因此无法使用实例变量,因为static与类的任何实例都没有关联。

正如错误所述:您的
数据
属性是非静态的。将其设置为静态以在静态上下文中访问它


但是,由于您的代码片段仅在非静态上下文中引用
fullNameValue
字段,因此您可能可以将fullNameValue声明为实例变量,这样代码就可以了。

正如错误所述:您的
数据
属性是非静态的。将其设置为静态以在静态上下文中访问它


但是,由于您的代码片段在非静态上下文中只引用了
fullNameValue
字段,因此您可以将fullNameValue声明为实例变量,这样代码就可以了。

那么,您可以将fullNameValue字段改为以下代码。我想这会解决你的错误

问题似乎是fullNameValue字段的初始化代码引用了数据属性(
Data[“FirstName”]
),但数据是实例属性,而不是静态属性,因此不能在静态上下文中引用它(即初始化静态字段时)

看起来您正在使用它进行单元测试。在这种情况下,在我看来,这段代码将为fullNameValue生成一个值,并将对所有测试用例重用该值

如果这是你想要的,那么这就可以了。然而,我的猜测是,如果您开始为不同的测试使用不同的测试数据,您可能会发现此代码的行为不正确,尽管我不熟悉ArtOfTest框架。如果这给您带来了麻烦,那么您可能需要重新考虑_fullNameValue字段是否应为
静态


或者,如注释中所述,您可以将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类的数据属性未初始化)。我省略了锁定代码,因为它可能不是必需的,OP对它的冗长表示了担忧

string _fullNameValue;

string fullNameValue
{
    get
    {
        if (_fullNameValue == null)
            _fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(this.Data["FirstName"]));

        return _fullNameValue;
    }
}

您可以将fullNameValue字段改为以下代码。我想这会解决你的错误

问题似乎是fullNameValue字段的初始化代码引用了数据属性(
Data[“FirstName”]
),但数据是实例属性,而不是静态属性,因此不能在静态上下文中引用它(即初始化静态字段时)

看起来您正在使用它进行单元测试。在这种情况下,在我看来,这段代码将为fullNameValue生成一个值,并将对所有测试用例重用该值

如果这是你想要的,那么这就可以了。然而,我的猜测是,如果您开始为不同的测试使用不同的测试数据,您可能会发现此代码的行为不正确,尽管我不熟悉ArtOfTest框架。如果这给您带来了麻烦,那么您可能需要重新考虑_fullNameValue字段是否应为
静态


或者,如注释中所述,您可以将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类的数据属性未初始化)。我省略了锁定代码,因为它可能不是必需的,OP对它的冗长表示了担忧

string _fullNameValue;

string fullNameValue
{
    get
    {
        if (_fullNameValue == null)
            _fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(this.Data["FirstName"]));

        return _fullNameValue;
    }
}

这不是导致错误的代码。可能我在这里遗漏了什么,但是您得到的错误引用了
数据
属性。发布该属性的代码。public BaseWebAiiTest.TestData D