(Xem giải pháp bên dưới tôi đã tạo bằng câu trả lời tôi chấp nhận)
Tôi đang cố gắng cải thiện khả năng duy trì của một số mã liên quan đến sự phản chiếu. Ứng dụng này có giao diện .NET Remote (trong số những thứ khác), một phương thức gọi là Execute để truy cập các phần của ứng dụng không có trong giao diện từ xa được xuất bản của nó.
Dưới đây là cách ứng dụng chỉ định các thuộc tính (một tĩnh trong ví dụ này) có nghĩa là có thể truy cập được qua Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Vì vậy, một người dùng từ xa có thể gọi:
string response = remoteObject.Execute("SomeSecret");
và ứng dụng sẽ sử dụng sự phản chiếu để tìm một sốClass.SomeProperty và trả về giá trị của nó dưới dạng một chuỗi.
Thật không may, nếu ai đó đổi tên someProperty và quên thay đổi parm thứ 3 của ExposeProperty (), nó sẽ phá vỡ cơ chế này.
Tôi cần tương đương với:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
để sử dụng như là parm thứ 3 trong ExposeProperty, vì vậy các công cụ tái cấu trúc sẽ đảm nhiệm việc đổi tên.
Có cách nào để làm việc này không? Cảm ơn trước.
Được rồi, đây là những gì tôi đã tạo ra (dựa trên câu trả lời tôi đã chọn và câu hỏi mà anh ấy tham khảo):
// <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;
}
Sử dụng:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Bây giờ với khả năng tuyệt vời này, đã đến lúc đơn giản hóa phương pháp ExposeProperty. Đánh bóng tay nắm cửa là công việc nguy hiểm ...
Cảm ơn mọi người.