2013-04-30 6 views
8

क्या कोई ऐसा फ़ंक्शन में नाम प्रदान करने का कोई तरीका है जो उस नाम के साथ किसी दिए गए ऑब्जेक्ट पर फ़ील्ड या प्रॉपर्टी का मान देता है? मैंने नल-कोलेसे ऑपरेटर के साथ इसके आसपास काम करने की कोशिश की, लेकिन स्पष्ट रूप से यह अलग-अलग प्रकारों को पसंद नहीं करता है (जो मेरे लिए थोड़ा अजीब भी है क्योंकि शून्य शून्य है)। अगर मैं इसे नल में अलग कर सकता हूं, लेकिन ऐसा करने का एक बेहतर तरीका होना चाहिए। यहां मेरा कार्य है, और Comparison ऑब्जेक्ट्स वाली दो पंक्तियां संकलित नहीं होती हैं, लेकिन मैं उन्हें वहां दिखाने के लिए वहां छोड़ दूंगा जो मैं करने की कोशिश कर रहा हूं।सी # प्रतिबिंब नाम से क्षेत्र या संपत्ति प्राप्त करें

private void SortByMemberName<T>(List<T> list, string memberName, bool ascending) 
{ 
    Type type = typeof (T); 
    MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName); 

    if (info == null) 
    { 
     throw new Exception("Member name supplied is neither a field nor property of type " + type.FullName); 
    } 

    Comparison<T> asc = (t1, t2) => ((IComparable) info.GetValue(t1)).CompareTo(info.GetValue(t2)); 
    Comparison<T> desc = (t1, t2) => ((IComparable) info.GetValue(t2)).CompareTo(info.GetValue(t1)); 

    list.Sort(ascending ? asc : desc); 
} 

मैंने गतिशील लिनक नामक कुछ के बारे में सुना है जिसका उपयोग किया जा सकता है, लेकिन सीखने के लिए, मैं इसे अपना रास्ता कर रहा हूं।

+2

शून्य coalescing ऑपरेटर काम नहीं करता है क्योंकि 'FieldInfo'' PropertyInfo' नहीं है। उन्हें कास्ट करने के लिए 'as'' का प्रयोग करें। – FlyingStreudel

उत्तर

12

बदलें इस लाइन:

MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName); 
इस के लिए

:

MemberInfo info = type.GetField(memberName) as MemberInfo ?? 
    type.GetProperty(memberName) as MemberInfo; 

आधार वर्ग के लिए कोई अंतर्निहित डाली है, क्योंकि जब उस तरह त्रिगुट ऑपरेटर का उपयोग। टर्नरी के लिए आवश्यक है कि सभी आउटपुट के प्रकार समान हों।

+4

यह टर्नरी ऑपरेटर नहीं है, यह शून्य-कोलेसिंग ऑपरेटर है। –

+1

इसके अलावा ... नाम * सशर्त * ऑपरेटर –

+0

@MichaelPerrenoud यह सच हो सकता है, लेकिन वे भाषा विशिष्ट में अलग ऑपरेटरों हैं। घटाव ऑपरेटर एक अस्वीकृति और एक अतिरिक्त के लिए सिंटेक्टिक चीनी हो सकता है, लेकिन यदि हां, तो क्या आप इसे अतिरिक्त ऑपरेटर कहते हैं? (और स्पेस सशर्त ऑपरेटर के लिए वैकल्पिक नाम के रूप में "टर्नरी ऑपरेटर" का उल्लेख करता है।) –

संबंधित मुद्दे