基本クラスに含まれる保護された Hashtable の派生クラスで宣言されたプロパティのバッキング フィールドをいくつか格納したいと考えています。派生クラスでのこのメカニズムの使用は、できるだけ単純にする必要があります。
では、呼び出しプロパティ (getter - プロパティは読み取り専用) に関する情報を提供するために使用できるので、MethodBase.GetCurrentMethod()
この特定のバッキング フィールドにアクセスできる唯一のプロパティとして認識できますか?
編集:
基本的に、私はパターンを実装したい:
private SomeClass _someProperty = null;
private SomeClass SomeProperty
{
if (_someProperty == null)
{
_someProperty = new SomeClass();
}
return _someProperty;
}
次のようになります。
private SomeClass SomeProperty
{
return GetProperty(delegate
{
var someProperty = new SomeClass();
return someProperty;
};
}
そして基本クラスで
private System.Collections.Hashtable _propertyFields = new System.Collections.Hashtable();
protected T GetProperty<T>(ConstructorDelegate<T> constructorBody)
{
var method = new System.Diagnostics.StackFrame(1).GetMethod();
if (!_propertyFields.ContainsKey(method))
{
var propertyObject = constructorBody.Invoke();
_propertyFields.Add(method, propertyObject);
}
return (T)_propertyFields[method];
}
protected delegate T ConstructorDelegate<T>();
これを行う理由は、プロパティの使用を簡素化するためです。プライベート プロパティを使用していくつかのオブジェクトを作成し、それらをクラスで使用します。しかし、それらのバッキング フィールドを同じクラスに格納すると、プロパティと同じようにそれらにアクセスできるため、(将来いくつかの派生クラスを作成するユーザーを意味する) 誤ってプロパティの代わりにバッキング フィールドを使用する可能性があります。オブジェクトの作成と使用を許可しながら、バッキングフィールドへのアクセスを制限したかったのです。
次のようなバッキング フィールドで ObsoleteAttribute を使用しようとしました。
[Obsolete("Don't use this field. Please use corresponding property instead.")]
private SomeClass __someProperty;
private SomeClass _someProperty
{
#pragma warning disable 0618 //Disable Obsolete warning for property usage.
get
{
if (__someProperty== null)
{
__someProperty = new SomeClass();
}
return __someProperty ;
}
#pragma warning restore 0618 //Restore Obsolete warning for rest of the code.
}
しかし、第一に、ユーザーにこのパターンの使用を強制することはできません。第二に、派生クラスに記述するコードが多すぎるため、上で述べたように、できるだけ単純にしたいと考えています。