2010-05-14 10 views
9

में संग्रह गुण पर ध्यान न दें मैं इस कोड के साथ एक समारोह है:PropertyInfo

foreach (PropertyInfo propertyInfo in typeof(T).GetProperties()){ 
//SOME CODE 
if (propertyInfo.CanWrite) 
    propertyInfo.SetValue(myCopy, propertyInfo.GetValue(obj, null), null); 
} 

मैं "संग्रह" गुण की जाँच करने से बच जाएंगे; ऐसा करने के लिए अब मैंने यह नियंत्रण डाला है:

if (propertyInfo.PropertyType.Name.Contains("List") 
    || propertyInfo.PropertyType.Name.Contains("Enumerable") 
    || propertyInfo.PropertyType.Name.Contains("Collection")) 
    continue; 

लेकिन, यह मुझे पसंद नहीं है!

ऐसा करने का एक बेहतर तरीका कौन सा है?

उत्तर

14

मैं सोच रहा था कि आप इंटरफेस संपत्ति औजार के प्रकार के जांच करना चाह सकते। (निकाला गया अनावश्यक इंटरफेस, के रूप में IList ICollection विरासत और ICollection IEnumerable इनहेरिट करती है।)

static void DoSomething<T>() 
{ 
    List<Type> collections = new List<Type>() { typeof(IEnumerable<>), typeof(IEnumerable) }; 

    foreach (PropertyInfo propertyInfo in typeof(T).GetProperties()) 
    { 
     if (propertyInfo.PropertyType != typeof(string) && propertyInfo.PropertyType.GetInterfaces().Any(i => collections.Any(c => i == c))) 
     { 
      continue; 
     } 

     Console.WriteLine(propertyInfo.Name); 
    } 
} 

मैं स्ट्रिंग को अस्वीकार नहीं करने के लिए, के रूप में यह IEnumerable लागू करता है, साथ ही कोड जोड़ा है, और मैं सोचा है कि आप उन के आसपास रखने के लिए चाहते हो सकता है।

संग्रह इंटरफेस की पूर्व सूची के अतिरेक के प्रकाश में, यह आसान हो सकता जैसे कोड लिखने के लिए इस

static void DoSomething<T>() 
{ 
    foreach (PropertyInfo propertyInfo in typeof(T).GetProperties()) 
    { 
     if (propertyInfo.PropertyType != typeof(string) 
      && propertyInfo.PropertyType.GetInterface(typeof(IEnumerable).Name) != null 
      && propertyInfo.PropertyType.GetInterface(typeof(IEnumerable<>).Name) != null) 
     { 
      continue; 
     } 

     Console.WriteLine(propertyInfo.Name); 
    } 
} 
+0

+1 मेरा उत्तर हटा दिया गया है क्योंकि यह बेहतर है। – GenericTypeTea

+7

IENumerable <> IENumerable लागू करता है, IENumerable <> की जांच करने की कोई आवश्यकता नहीं है <> – MaLio

8

मैं शायद IEnumerable के खिलाफ जांच करूँगा।

if ((typeof(string) != propertyInfo.PropertyType) 
    && typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType)) 
{ 
    continue; 
} 
+0

ओह ओह, अब मैं एक समस्या ... इस हालत भी सच है है स्ट्रिंग संपत्ति के लिए। संभव है? –

+0

मैं अन्य पोस्ट समाधान के साथ हल करता हूं। –

+0

@LukePet: स्ट्रिंग्स 'IENumerable' लागू करें क्योंकि वे वर्णों का संग्रह हैं। एंथनी का जवाब विशेष रूप से तारों को छोड़ देता है, इसलिए आप इसे चुनने का अधिकार रखते हैं (और मैंने अपना उत्तर सूट का पालन करने के लिए अपडेट किया है)। – LukeH

4
bool isCollection = typeof(System.Collections.IEnumerable) 
          .IsAssignableFrom(propertyInfo.PropertyType); 
+0

सही उत्तर से बेहतर – JeffZhnn

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