(私が受け入れた答えを使用して作成した以下のソリューションを参照してください)
リフレクションを含むいくつかのコードの保守性を改善しようとしています。アプリには、公開されたリモートインターフェイスに含まれていないアプリの部分にアクセスするためのExecuteというメソッドを公開する.NET Remotingインターフェイスがあります。
ここでは、アプリケーションが実行を介してアクセスできるようになっているプロパティ(この例では静的プロパティ)を指定する方法を示します。
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
したがって、リモートユーザーは次のように呼び出すことができます。
string response = remoteObject.Execute("SomeSecret");
アプリはリフレクションを使用してSomeClass.SomePropertyを検索し、その値を文字列として返します。
残念ながら、誰かがSomePropertyの名前を変更して、ExposeProperty()の3番目のパラメーターを変更するのを忘れると、このメカニズムが壊れます。
私は同等のものを必要としています:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
ExposePropertyの3番目のパラメーターとして使用するため、リファクタリングツールが名前の変更を処理します。
これを行う方法はありますか?前もって感謝します。
さて、これが私が作成したものです(私が選択した答えと彼が参照した質問に基づいて):
// <summary>
// Get the name of a static or instance property from a property access lambda.
// </summary>
// <typeparam name="T">Type of the property</typeparam>
// <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
// <returns>The name of the property</returns>
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
var me = propertyLambda.Body as MemberExpression;
if (me == null)
{
throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
}
return me.Member.Name;
}
使用法:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
この素晴らしい機能を備えた今、ExposePropertyメソッドを単純化する時が来ました。ドアノブの研磨は危険な作業です...
みんな、ありがとう。