بسم الله الرحمن الرحيم

في معظم الأحيان نحتاج لتمرير اسم الخاصية عبر الإجراءات من خلال بارمتر من النوع String

وهذا هو المشهور

ولكن التعامل مع الأسماء كنص له محاذير أثناء التطوير لأنك لو كنت تتعامل مع فئة وليكن فئة تمثل جدول في قاعدة بيانات و تحتوي على خصائص تمثل الأعمدة أو الحقول في ذاك الجدول وأردت التعامل معها وتم استخدام أسماءها لتمريرها عبر الإجراءات فإنه قد يحصل أن تغير الفئة مستقبلا وتقوم بتغيير أسماء الخصائص أو تحذف بعضها

حينها سيتولد أخطاء أثناء التنفيذ وفقط عندما يتم الوصول إلى الإجراء الذي يستخدم اسم غير موجود ولكن أثناء الترجمة لن تنتبه لذلك

ولكن ألا أدلك على طريقة تنبهك للتغيرات وقت الترجمة Compiling Time

كيف ؟

هو بتمرير الاسم من خلال تعبير لمبدا Lambda Expression

فبدلا من استخدام :

Foo("FirstName");

يمكن تمريره كخاصية كما يلي :

var p = new Person();
Foo(() => p.FirstName);

بحيث يكون نوع البارمتر هو تعبير : public void Foo(Expression> propertySelector) { // Do Something }

وحينها يمكن الحصول على الاسم كما يلي : نعرف إجراء ستاتيكي لاستخراج الاسم من التعبير

public static string GetName(Expression<Func<object>> expression)
{
    var unaryExpression = expression.Body as UnaryExpression;
    var memberExpression = unaryExpression.Operand as MemberExpression;
    if(memberExpression == null)
    {
        throw new InvalidOperationException();
    }

    return memberExpression.Member.Name;
}

ثم نحصل على الاسم كما يلي :

public void Foo(Expression<Func<object>> propertySelector)
{
    var name = GetName(propertySelector);
    // Do Something
}

وبهذه الطريقة فإن أي تغيير في أسماء الخصائص سينبهك أثناء الترجمة إلى أماكن استخدام الخاصية لتقوم بتصحيحها

أو أنك إذا صححتها عن طريق F2 أي Refactor سيقوم بتعديلها في كل الأماكن

وللعلم هذه الطريقة المستخدمة في مشاريع ASP.Net نمط MVC