(ดูวิธีแก้ปัญหาด้านล่างที่ฉันสร้างโดยใช้คำตอบที่ฉันยอมรับ)
ฉันพยายามปรับปรุงความสามารถในการบำรุงรักษาของโค้ดบางอย่างที่เกี่ยวกับการสะท้อนกลับ แอปนี้มี. NET Remoting interface ซึ่งเป็นวิธีการที่เรียกว่า Execute สำหรับการเข้าถึงส่วนต่าง ๆ ของแอพซึ่งไม่ได้รวมอยู่ในอินเทอร์เฟซระยะไกลที่เผยแพร่
นี่คือวิธีที่แอปกำหนดคุณสมบัติ (แบบคงที่ในตัวอย่างนี้) ซึ่งหมายถึงให้สามารถเข้าถึงได้ผ่าน Execute:
RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");
ดังนั้นผู้ใช้ระยะไกลสามารถโทร:
string response = remoteObject.Execute("SomeSecret");
และแอพจะใช้การสะท้อนเพื่อค้นหา SomeClass.SomeProperty และส่งคืนค่าเป็นสตริง
น่าเสียดายที่ถ้ามีคนเปลี่ยนชื่อ SomeProperty และลืมเปลี่ยน parm ที่ 3 ของ ExposeProperty () มันจะทำลายกลไกนี้
ฉันต้องการเทียบเท่า:
SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()
ใช้เป็น parm ตัวที่ 3 ใน ExposeProperty ดังนั้นเครื่องมือการรีแฟคเตอร์จะดูแลการเปลี่ยนชื่อ
มีวิธีทำเช่นนี้หรือไม่? ขอบคุณล่วงหน้า.
ตกลงนี่คือสิ่งที่ฉันสร้างขึ้น (ตามคำตอบที่ฉันเลือกและคำถามที่เขาอ้างถึง):
// <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 การขัดลูกบิดประตูเป็นงานที่อันตราย ...
ขอบคุณทุกคน