私はこれの例を見たことを誓いますが、少しの間グーグルで探していて、見つけることができません.
オブジェクトへの参照があり、GET が必要なクラスがあります。そのための方法。私の問題は、誰もそれをいじることができないようにしたいということです。つまり、読み取り専用バージョンを取得してもらいたいのです (クラス内から変更できるようにする必要があることに注意してください)。
ありがとう
私はこれの例を見たことを誓いますが、少しの間グーグルで探していて、見つけることができません.
オブジェクトへの参照があり、GET が必要なクラスがあります。そのための方法。私の問題は、誰もそれをいじることができないようにしたいということです。つまり、読み取り専用バージョンを取得してもらいたいのです (クラス内から変更できるようにする必要があることに注意してください)。
ありがとう
簡素化されたインターフェイスへの参照を返します。
interface IFoo
string Bar { get; }
class ClassWithGet
public IFoo GetFoo(...);
オブジェクトがそれほど複雑/広範でない場合は、その周りにラッパーを記述します。
例えば:
class A {
public string strField = 'string';
public int intField = 10;
}
class AWrapper {
private A _aObj;
public AWrapper(A aobj) {
_aObj = A;
}
public string strField {
get {
return _aObj.strField;
}
}
public int intField {
get {
return _aObj.intField;
}
}
}
つまり、クライアントコードにAWrapperクラスのインスタンスを指定するだけで、クライアントはユーザーに表示を許可したものだけを使用できるようになります。
これは少し複雑になる可能性があり、基本クラスが石に設定されていない場合はうまくスケーリングできない可能性がありますが、ほとんどの単純な状況では、それでうまくいく可能性があります。これはファサードパターンと呼ばれていると思います(ただし、それについては引用しないでください=))
あなたの質問は、あなたが探しているように見えます:
public PropertyName { get; private set; }
しかし、これまでの回答を考えると、あなたの質問を正しく解釈しているかどうかわかりません。その上、ジョン・スキートに質問する私は誰ですか?:)
ReadOnlyCollection に同意します
私の簡単なコードを見てください:
private List<Device> _devices;
public readonly System.Collections.ObjectModel.ReadOnlyCollection<Device> Devices
{
get
{
return (_devices.AsReadOnly());
}
}
ReadOnlyCollection には Add メソッドがないため、ユーザーはそれにプロパティを追加できません。しかし、ユーザーがメソッドを呼び出してオブジェクトを変更できるかどうかは保証されません。
私はある意味でこの問題に直面しました。私は CategoryViewModel クラスを持っています。これには、プライベートな読み取り専用にするプロパティ Category があります。
public CategoryViewModel
{
private Category { get; }
}
実際、他のクラスに読み取り専用としてエクスポートしたいと考えています。しかし、私はそのようなことはできません。私の場合(おそらく他の人に役立つかもしれません)、リポジトリに追加したいと思います。私が見つけた唯一の方法は、リポジトリを param 1 として関数を持ち、 action を param 2 として持つことです:
public void ApplyAction(ICategoryRepository repo, Action<ICategoryRepository, Category> action)
{
action(repo, Category);
}
そのように、他の場所から、私はそのようなことを行うことができます:
categoryViewModel.ApplyAction(_repository, (r, c) => r.MarkForInsertOrUpdate(c));
これは、他の人が特定の場合にのみプロパティを公開し、それらを管理するのに役立ちます。