(Lihat solusi di bawah ini yang saya buat menggunakan jawaban yang saya terima)
Saya mencoba untuk meningkatkan pemeliharaan dari beberapa kode yang melibatkan refleksi. Aplikasi ini memiliki antarmuka .NET Remoting mengekspos (antara lain) metode yang disebut Jalankan untuk mengakses bagian-bagian dari aplikasi yang tidak termasuk dalam antarmuka jarak jauh yang diterbitkan.
Berikut adalah cara aplikasi menentukan properti (yang statis dalam contoh ini) yang dimaksudkan agar dapat diakses melalui Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
Jadi pengguna jarak jauh dapat menelepon:
string response = remoteObject.Execute("SomeSecret");
dan aplikasi akan menggunakan refleksi untuk menemukan SomeClass.SomeProperty dan mengembalikan nilainya sebagai string.
Sayangnya, jika seseorang mengganti nama SomeProperty dan lupa untuk mengubah parm ke-3 dari ExposeProperty (), ia merusak mekanisme ini.
Saya perlu yang setara dengan:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
untuk digunakan sebagai parm ke-3 di ExposeProperty sehingga alat refactoring akan menangani penggantian nama.
Apakah ada cara untuk melakukan ini? Terima kasih sebelumnya.
Oke, inilah yang akhirnya saya buat (berdasarkan jawaban yang saya pilih dan pertanyaan yang dia referensikan):
// <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;
}
Pemakaian:
// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);
// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);
Sekarang dengan kemampuan keren ini, saatnya menyederhanakan metode ExposeProperty. Memoles gagang pintu adalah pekerjaan berbahaya ...
Terimakasih semuanya.