2010-08-26 15 views
5

ठीक है, इसलिए मैं जेनेरिक के बारे में सीख रहा हूं और मैं यह चीज़ चलाने की कोशिश कर रहा हूं, लेकिन यह मुझे एक ही त्रुटि कह रहा है। कोड यह रहा:गैर-स्थैतिक विधि को PropertyInfo.SetValue

public static T Test<T>(MyClass myClass) where T : MyClass2 
{ 
    var result = default(T); 
    var resultType = typeof(T); 
    var fromClass = myClass.GetType(); 
    var toProperties = resultType.GetProperties(); 

    foreach (var propertyInfo in toProperties) 
    { 
     var fromProperty = fromClass.GetProperty(propertyInfo.Name); 
     if (fromProperty != null) 
      propertyInfo.SetValue(result, fromProperty, null); 
    } 

    return result; 
} 

उत्तर

8

ऐसा इसलिए होता है क्योंकि default(T)null देता है क्योंकि T एक संदर्भ प्रकार का प्रतिनिधित्व करता है। संदर्भ प्रकारों के लिए डिफ़ॉल्ट मान null हैं।

आप करने के लिए अपने विधि को बदल सकता है:

public static T Test<T>(MyClass myClass) where T : MyClass2, new() 
{ 
    var result = new T(); 
    ... 
} 

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

+0

धन्यवाद, कि मैं के लिए बस की तलाश थी ... –

3

समस्या है कि यहाँ TMyClass से निकला है और इसलिए एक संदर्भ प्रकार है। तो अभिव्यक्ति default(T) मूल्य null वापस कर देगा। SetValue को निम्न कॉल null मान का संचालन कर रहा है लेकिन संपत्ति एक उदाहरण संपत्ति है इसलिए आपको निर्दिष्ट संदेश मिलता है।

आप निम्न

  1. में से एक करने के लिए टेस्ट कार्य करने के लिए T की एक वास्तविक उदाहरण दर्रा केवल प्रकार पर स्थिर गुण सेट
  2. पर संपत्ति मूल्यों को निर्धारित करने की आवश्यकता होगी
1
के बजाय

propertyInfo.SetValue(result, fromProperty, null); 

कोशिश

:

foreach (var propertyInfo in toProperties) 
{ 
    propertyInfo.GetSetMethod().Invoke(MyClass2, new object[] 
    { 
     MyClass.GetType().GetProperty(propertyInfo.Name). 
     GetGetMethod().Invoke(MyClass, null) 
    }); 
} 
संबंधित मुद्दे