11

プロパティの名前を変更し、INotifyPropertyChanged の PropertyChanged イベントのプロパティ名を除いて、Visual Studio の名前変更機能が必要なすべての名前変更を処理することを期待するのは、やや一般的なイベントである必要があります。手動で名前を変更することを覚えておく必要がないように、どうにかして強く型付けするより良い方法はありますか?

4

7 に答える 7

6

C#5には解決策があるようです。パラメータで使用できるCallerMemberName属性を使用します(ネット上の1つの例)。

class Employee : INotifyPropertyChanged
{
    private string _Name;
    public string Name
    {
        get { return _Name; }

        set
        {
            _Name = value;
            RaisePropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        var temp = PropertyChanged;

        if ( temp != null )
        {
            temp( this, new PropertyChangedEventArgs( caller ) );
        }
    }
}
于 2013-01-17T08:44:38.003 に答える
1

理論的には、プロパティセッター内からMethodBase.GetCurrentMethod()。Name.Substring(4)を使用できます。残念ながら、グーグル検索はそれが重大なパフォーマンスに影響を与えるように思われることを明らかにします。考慮すべきもう2つのこと:

  • JITインライン化は、予期しない方法でこれに影響を与える可能性があります。(stackoverflow.com/questions/616779/can-i-check-if-the-c-compiler-inlined-a-method-call)
  • 理論的には、MethodBase.GetCurrentMethod()へのIL呼び出しは、実行時にldtoken命令を使用してJITに簡単に置き換えることができ、その後にMethodBase.GetMethodFromHandle()を呼び出すことができます。これは非常に高速です。ユーザーはこれの必要性を表明していないと思います。(msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldtoken.aspx)
  • ここで完全に私の意見ですが、C#にfieldof()およびmethodof()演算子があると便利だと思います。その能力を必要とするプロジェクトのコード分析/リファクタリングツールの信頼性が大幅に向上すると思います。
于 2009-07-14T22:17:46.137 に答える
0

このブログ投稿をチェックしてください。これにより、次のことが可能になります。

string propertyName = TypeHelper.GetPropertyName<User>(u => u.LastProjectCode);

PropertyInfo property1 = TypeHelper.GetProperty((SomeClass o) => o.InstanceProperty.Length);

PropertyInfo property2 = TypeHelper.GetProperty(() => SomeClass.StaticProperty.Length);

その場合、Visual Studio/Resharper/Refactor Pro での名前変更が機能するはずです。

于 2009-11-02T17:23:48.053 に答える