(수락 한 답변을 사용하여 만든 솔루션을 아래에서 참조하십시오)
리플렉션과 관련된 일부 코드의 유지 보수성을 개선하려고합니다. 이 앱에는 게시 된 원격 인터페이스에 포함되지 않은 앱의 일부에 액세스하기 위해 Execute라는 방법을 노출시키는 .NET Remoting 인터페이스가 있습니다.
다음은 앱이 Execute를 통해 액세스 할 수있는 속성 (이 예제에서는 정적 속성)을 지정하는 방법입니다.
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
따라서 원격 사용자는 다음을 호출 할 수 있습니다.
string response = remoteObject.Execute("SomeSecret");
그리고 앱은 리플렉션을 사용하여 SomeClass.SomeProperty를 찾고 그 값을 문자열로 반환합니다.
불행히도 누군가 누군가 SomeProperty의 이름을 바꾸고 ExposeProperty ()의 세 번째 매개 변수를 변경하는 것을 잊어 버린 경우이 메커니즘을 손상시킵니다.
나는 다음과 동등해야합니다.
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 메서드를 단순화 할 차례입니다. 문 손잡이 연마는 위험한 작업입니다 ...
모두 감사합니다.