問題に対するより汎用的で、より安全で再利用可能な解決策は、次のような汎用の「パラメータ化された」プロパティ クラスを実装することです。
// Generic, parameterized (indexed) "property" template
public class Property<T>
{
// The internal property value
private T PropVal = default(T);
// The indexed property get/set accessor
// (Property<T>[index] = newvalue; value = Property<T>[index];)
public T this[object key]
{
get { return PropVal; } // Get the value
set { PropVal = value; } // Set the value
}
}
次に、クライアントがインデックス、記述子、セキュリティ キーなどを使用してプロパティを設定/取得できるように、パブリック クラス内に任意の数のプロパティを実装できます。次のようにします。
public class ParameterizedProperties
{
// Parameterized properties
private Property<int> m_IntProp = new Property<int>();
private Property<string> m_StringProp = new Property<string>();
// Parameterized int property accessor for client access
// (ex: ParameterizedProperties.PublicIntProp[index])
public Property<int> PublicIntProp
{
get { return m_IntProp; }
}
// Parameterized string property accessor
// (ex: ParameterizedProperties.PublicStringProp[index])
public Property<string> PublicStringProp
{
get { return m_StringProp; }
}
}
最後に、クライアント コードは、次のようにパブリック クラスの「パラメーター化された」プロパティにアクセスします。
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
確かに、これは奇妙に思えますが、間違いなくうまくいきます。さらに、クライアント コードの観点からは、これはまったく奇妙ではありません。単純で直感的で、実際のプロパティのように機能します。C# の規則に違反することはなく、他の .NET マネージ言語と互換性がないこともありません。また、クラス実装者の観点から見ると、ここに示すように、再利用可能で汎用的な「パラメーター化された」プロパティ テンプレート クラスを作成すると、コンポーネントのコーディングが比較的簡単になります。
注: いつでもジェネリック プロパティ クラスをオーバーライドして、インデックス付きルックアップ、セキュリティ制御されたプロパティ アクセス、または必要なものすべてなどのカスタム処理を提供できます。
乾杯!
マーク・ジョーンズ