سؤال

كان

وستاكوفيرفلوو jolson المستخدم قطعة جميلة جدا من التعليمات البرمجية التي تجسد كيف يمكن للمرء أن تسجيل menthods دون استخدام السلاسل، ولكن أشجار التعبير <لأ href = "https://stackoverflow.com/questions/9033/hidden-features-of- ج # 52998 "> هنا .

هل من الممكن أن يكون شيئا من هذا القبيل على العقارات بدلا من الأساليب؟ لتمرير خاصية (وليس اسم العقار) وداخل طريقة للحصول على اسم العقار؟

وشيء من هذا القبيل:


    RegisterMethod(p => p.Name)

    void RegisterMethod(Expression??? propertyExpression) where T : Property ???
    {
        string propName = propertyExpression.Name;
    }

وشكرا.

هل كانت مفيدة؟

المحلول

ويمكنك كتابة شيء على ما يلي:

static void RegisterMethod<TSelf, TProp> (Expression<Func<TSelf, TProp>> expression)
{
    var member_expression = expression.Body as MemberExpression;
    if (member_expression == null)
        return;

    var member = member_expression.Member;
    if (member.MemberType != MemberTypes.Property)
        return;

    var property = member as PropertyInfo;
    var name = property.Name;

    // ...
}

نصائح أخرى

ونشرت لي مثالا الكامل لهذا <وأ href = "http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/f44dc57a9dc5168d/02c312dcf8a9a769#4805324df6b30218" يختلط = " noreferrer "> هنا (انظر أيضا منصب حول" this "تحته)

ملاحظة أنه يتعامل مع LambdaExpression وما إلى ذلك استكمالا لالكود كما نشر، يمكنك إضافة أكثر قليلا لجعله أسهل للاستخدام في بعض الحالات:

static class MemberUtil<TType>
{
    public static string MemberName<TResult>(Expression<Func<TType, TResult>> member)
    {
        return MemberUtil.MemberName<TType, TResult>(member);
    }
}

وبعد ذلك يمكنك استخدام عام نوع الاستدلال لقيمة الإرجاع:

string test1 = MemberUtil<Foo>.MemberName(x => x.Bar); 
string test2 = MemberUtil<Foo>.MemberName(x => x.Bloop()); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top