2017-01-17 4 views
-1

私はクラスの下に持っていると仮定:入れ子のクラスで取得する唯一のプロパティ

public class ClassA 
{ 
    public string ElementA { get; } 
    public string ElementB { get; } 
} 

public class ClassB 
{ 
    public ClassA ElementC = new ClassA() 
    { 
     ElementA = "Sample Value A", 
     ElementB = "Sample Value B" 
    }; 

    public ClassB ElementD = new ClassA() 
    { 
     ElementA = "Sample Value C", 
     ElementB = "Sample Value D" 
    }; 
} 

どのようにiの巣にClassAの内側とだけ{ get; }財産とのClassBの要素としてすることができます。私はそれが固定変数/値として動作するように、{ get; }アセスメントを介してのみアクセスできるクラスをインスタンス化しようとしています。 - それだけで

を読ん ある

enter image description here

をプロパティまたはインデクサ「ClassA.ElementAは」に割り当てることはできません:私は述べている。このアプローチを試みるたびIDE(Visual Studioは)私にエラーがスローされます

ようにClassAを書く

public class ClassA 
{ 
    public string ElementA { get; set; } 
    public string ElementB { get; set; } 
} 

ClassBの者にClassA要素が編集可能になりますがスローされません。 IDE(Visual Studio)でエラーが発生しました。

私の考え方はどうやってできますか?ありがとう。

+2

コンストラクタを試しますか? –

+0

get;プライベートセット –

答えて

2

あなたは、クラスの外部から変更されたプロパティを望むプライベートセッターを追加し、インスタンス化時に値を設定するために、クラスのコンストラクタを変更しない場合は、次の

public class ClassA 
{ 
    public ClassA(string elementA, string elementB) 
    { 
     ElementA = elementA; 
     ElementB = elementB; 
    } 

    public string ElementA { get; private set; } 
    public string ElementB { get; private set; } 
} 

その後から、それをインスタンス化は次のようになります:

public class ClassB 
{ 
    public ClassA ElementC = new ClassA("Sample Value A", "Sample Value B"); 
} 
+0

これは私の質問に答えた。ありがとう@グラント! – TheQuestioner

+0

あなたは大丈夫ですか? –

+0

C#6では、プライベートセッターを追加する必要はありません。 – Kyle

2

次のように定義されたプロパティ:

public Foo Bar { get; } 

がこれに相当します

private readonly Foo bar; 

public Foo Bar { get { return this.bar; } } 

readonlyキーワードは、フィールドは、クラスのコンストラクタ(またはフィールドの初期化リストに割り当てることができますを意味し、コンストラクタメソッドの本体の前に実行されます)。

フィールドはプライベートなので、タイプのアクセススコープの外部からは設定できません。フィールドはreadonlyなので、コンストラクタ内にある必要があります。外部提供の値を使用するには、コンストラクタパラメータ

public ClassA(Foo value) { 
    this.Bar = value; 
} 
+0

よく説明されています。これを念頭に置いて、私の将来の参考にこれを保存します。 @大丈夫ありがとう! – TheQuestioner

関連する問題