2012-01-04 28 views
1

我使用靜態變量的代碼文件的開始,因爲我後來用它來驗證值:對象引用需要非靜態字段

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

+0

這是不是導致錯誤的代碼。 – 2012-01-04 14:36:12

+0

也許我在這裏錯過了一些東西,但是你得到的錯誤引用了一個'Data'屬性。從該屬性發布代碼。 – MusiGenesis 2012-01-04 14:37:06

+0

public BaseWebAiiTest.TestData Data {get; } – algot 2012-01-04 14:42:50

回答

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; 
    } 
} 
+0

也許我不能使用靜態變量? 公共類PricingForm:BaseWebAiiTest' { 串fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(數據[ 「姓」])); public void FillFullName() { //在'Field_FullName'中輸入文本 Pages.SitecoreCMS.Field_FullName.Text = this.fullNameValue; }} – algot 2012-01-04 15:06:55

+0

@algot - 是的,這將正常工作。行爲會稍有不同(您的PricingForm類的每個實例都將擁有它自己的fullNameValue的唯一值,而不是具有相同值的所有實例),但這可能是您想要的。 – 2012-01-04 15:09:29

+0

我以這種方式更改了代碼,但仍然出現錯誤。 **是所必需的非靜態場** – algot 2012-01-04 15:13:56

1

您還必須具有Data變量作爲static。您聲明fullNameValuestatic,這意味着您處於靜態上下文中,因此無法使用實例變量,因爲靜態未關聯到類的任何實例。

2

由於錯誤提示:您的Data屬性是非靜態的。將其設置爲靜態以在靜態上下文中訪問它。

但是,由於您的代碼片段僅在非靜態上下文中引用fullNameValue字段,因此您可以將fullNameValue聲明爲實例變量,並且代碼將會正常。

+0

我怎麼能把它變成靜態的? – algot 2012-01-04 14:43:26

相關問題