このメソッドと説明を検討してください。
[Description("It must be called from a property, else it is a runtime error.")]
protected T Load<T>()
{
return InternalLoad<T>();
}
このメソッドの設計では、呼び出し元がプロパティである必要があり、そうでない場合InternalLoad
は例外がスローされます。StackFrameを使用して呼び出し元の名前を取得し、get_<PropertyName>
またはの形式でない場合はset_<PropertyName>
、例外をスローします。それはすべて私が好きではない実行時に起こります。
呼び出し元が常にプロパティであることをコンパイル時に確認する方法があるかどうかを知りたいです。つまり、プロパティのみがこのメソッドを呼び出すことができるようにする必要があります。コンパイル時にそれをチェックする方法はありますか?
最後の手段として、それを確認するためにカスタム属性 ( などCallableFromAttribute
) を使用する C# コンパイラを拡張することは可能ですか?
できるだけ柔軟にしたい:
[CallableFrom(Caller.Property)] //Caller is an enum
protected T Load<T>()
{
return InternalLoad<T>();
}
[CallableFrom(Caller.Property | Caller.Method)]
protected T SomeOtherLoad<T>()
{
//code
}
その後
public string Method()
{
var x = this.SomeOtherLoad<string>(); //okay
var y = this.Load<string>(); //compilation error !!
}
混乱がある場合はお知らせください。私はそれを明らかにします。:-)
プロパティを定義する必要がある他のクラスの基本PropertyManager
クラスとして機能するクラスを実装しようとしているため、この機能が必要です。このクラスの一般的な使用法は次のとおりです。
public sealed Vendor : PropertyManager
{
public string VendorName
{
get { return this.Load<string>(); }
set { this.Store(value); }
}
public DateTime Created
{
get { return this.Load<DateTime>(); }
set { this.Store(value); }
}
}
ここLoad
とStore
基本クラスで定義されたメソッドは、呼び出されたプロパティの名前を検出します。その名前をkeyとして扱い、関連付けられた値を辞書から読み取るLoad
か ( の場合)、それに書き込みます ( の場合Store
)。プロパティの変更と変更されたイベントを発生させます。ProperyMananger
また、プロパティに加えられたすべての変更を簡単に追跡できるため、元に戻すこともサポートされています。