2012-01-04 8 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

これはエラーの原因となるコードではありません。 –

+0

多分私はここで何かを見逃していますが、あなたが得るエラーは 'Data'プロパティを参照しています。そのプロパティからコードを投稿します。 – MusiGenesis

+0

パブリックBaseWebAiiTest.TestDataデータ{get; } – algot

答えて

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フレームワークに精通していませんが、さまざまなテストに異なるテストデータを使用し始めると、このコードが誤って動作することがわかります。これで問題が発生した場合は、_フルルーム値フィールドが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(DATA [ "姓"]))。 public void FillFullName() { // 'Field_FullName'にテキストを入力 Pages.SitecoreCMS.Field_FullName.Text = this.fullNameValue; } } – algot

+0

@algot - うん、うまくいく。その振る舞いはわずかに異なります(PricingFormクラスの各インスタンスは、同じ値を持つすべてのインスタンスではなく、fullNameValueの独自の値を持ちます)。 –

+0

私はこのようにコードを変更しますが、それでもエラーは発生します。 **静的でないフィールドにはオブジェクト参照が必要です** – algot

1

Data変数をstaticとする必要があります。 fullNameValuestaticと宣言しています。つまり、静的コンテキスト内にあるため、インスタンス変数を使用できません。これは、staticがクラスのインスタンスに関連付けられていないためです。

2

エラーメッセージ:Dataプロパティは静的ではありません。静的コンテキストで静的にアクセスするには静的にします。

ただし、コードスニペットは非スタティックコンテキストのfullNameValueフィールドのみを参照するため、おそらくfullNameValueをインスタンス変数として宣言でき、コードは問題ありません。

+0

どうすれば静的にすることができますか? – algot

関連する問題