2

このメソッドと説明を検討してください。

[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); }
    }
}

ここLoadStore基本クラスで定義されたメソッドは、呼び出されたプロパティの名前を検出します。その名前をkeyとして扱い、関連付けられた値を辞書から読み取るLoadか ( の場合)、それに書き込みます ( の場合Store)。プロパティの変更と変更されたイベントを発生させます。ProperyManangerまた、プロパティに加えられたすべての変更を簡単に追跡できるため、元に戻すこともサポートされています。

4

1 に答える 1

0

いいえ、コンパイル時にそのような可能性はありません。存在することはできません。このようなコンパイル時のチェックはすべて、メソッドを呼び出すメソッドではなく、メソッドにアクセスするメソッドからメソッドにアクセスできるかどうかに基づいています。プロパティ セッターがデリゲートを介して公開する場合Load、理論的に修正されたコンパイラであっても、別のプロパティ セッター以外に誰もそのデリゲートを使用していないことをコンパイル時にチェックする方法はありません。

なぜこれが必要なのかわからないので、チェックが必要であり、実行時チェックが必要なものを正確に検証すると仮定しています。その仮定が間違っている場合、いくつかのオプションがあるかもしれませんが、尋ねられた質問は単に不可能です。

于 2013-01-14T11:51:56.403 に答える