2014-10-24 9 views
6

मैं मौजूदा कोड से यूनिवर्सल क्लास लाइब्रेरी का निर्माण कर रहा हूं, और मुझे कुछ कंपाइलर चेतावनियां मिलती हैं कि मैं इसके जीवन के लिए यह नहीं समझ सकता कि क्या करना है।मैं मार्शल.SizeOf (ऑब्जेक्ट) को मार्शल.SizeOf <T>() के साथ कैसे बदल सकता हूं?

मैं इस तरह कोड है:

void SomeMethod(Object data) 
{ 
    var size = Marshal.SizeOf(data); 
    ... 
} 

कोड बनाता है, लेकिन यूनिवर्सल परियोजना (और, मुझे लगता है, .NET 4.5.1 और उच्च परियोजनाओं) मैं निम्नलिखित संकलक चेतावनी मिलती है में:

चेतावनी CS0618: 'System.Runtime.InteropServices.Marshal.SizeOf (वस्तु)' अप्रचलित है: 'sizeof (वस्तु) आगामी रिलीज़ में उपलब्ध नहीं रहेंगे। इसके बजाय, SizeOf < टी >() का उपयोग करें।

लेकिन मैं सामान्य पैरामीटर कम विधि Marshal.SizeOf<T>() का उपयोग करके उपरोक्त मामले में Marshal.SizeOf(Object) के लिए एक स्थानापन्न कैसे बना सकता हूँ? सैद्धांतिक रूप से, मुझे नहीं पता कि data किस प्रकार का है?

ऐसा इसलिए है क्योंकि Marshal.SizeOf(Object) का उपयोग करना बुरा अभ्यास माना जाता है कि इसे Obsolete का श्रेय दिया गया है? और ले-होम संदेश वास्तव में "कोड को पूरी तरह से दोहराएं" होना चाहिए?

+3

यह निश्चित रूप से 4.5.1 में अप्रचलित नहीं है। मैं अनुमान लगा रहा हूं कि इसे विशेष रूप से सार्वभौमिक संदर्भ असेंबली में अप्रचलित कर दिया गया था क्योंकि यह .NET मूल के आगे के समय संकलक के लिए गर्दन में दर्द है। यह स्पष्ट नहीं है कि आप केवल कुछ विधि सामान्य क्यों नहीं बना सकते। यदि आप नहीं कर सकते हैं तो .NET मूल टूलचैन भी परेशानी के लिए उत्तरदायी है। –

+1

मैंने अपना जवाब हटा दिया है। कृपया एमएसडीएन पर [SizeOf (टी) देखें (http://msdn.microsoft.com/en-us/library/vstudio/dn261467 (v = vs.110) .aspx)। इसमें '' और एक पैरामीटर भी लगता है। आप वहां अपनी ऑब्जेक्ट पास कर सकते हैं, और इसे ठीक से मापा जाएगा। मुझे पूरा यकीन है कि आपको सफलतापूर्वक 'Marhal.SizeOf (डेटा)' पास करने में सक्षम होना चाहिए। इस बात को इंगित करने के लिए NemanjaBoric के लिए Kudos। मैं इसके साथ एक जवाब नहीं लिख रहा हूं, क्योंकि अगर यह वास्तव में काम करता है तो मैं सत्यापित नहीं कर सकता (मेरे पास अब 4.5.1 कंपाइलर नहीं है), लेकिन मुझे नहीं लगता कि इसे अंतिम वस्तु क्यों लेनी चाहिए और यह इसे पढ़ सकता है वास्तविक प्रकार – quetzalcoatl

+0

आपकी सभी मदद के लिए धन्यवाद, @quetzalcoatl और NemanjaBoric। 'SizeOf' अधिभार को याद करने के लिए मुझे मूर्खतापूर्ण। मैं इसे आज़मा दूंगा और देख सकता हूं कि यह मेरी आवश्यकताओं के अनुरूप कितना अच्छा है। –

उत्तर

0

ठीक है, ऐसा लगता है अपनी टिप्पणी मिलने के बाद ही है कि सब कुछ आप की जरूरत पहले से ही वहाँ है:

SizeOf<T>(T): मुझे लगता है कि इस प्रक्रिया में की जरूरत है, लेकिन आप explictly सामान्य पैरामीटर को परिभाषित करने की जरूरत नहीं है, कारण type inference पर। आप सरल लिखते हैं var size = Marshal.SizeOf(myStructure); और संकलक दिए गए ऑब्जेक्ट से प्रकार निकाल देगा और जेनेरिक पैरामीटर भर देगा।

SizeOf<T>(): यह विधि आसान होती है जब आपकी अपनी कक्षा पहले से ही एक सामान्य वर्ग हो सकती है और आपके पास T है लेकिन उपयोग किए गए सामान्य प्रकार का कोई वास्तविक उदाहरण नहीं है। उस मामले में इस विधि का चयन किया जाना चाहिए।

कैसे इस प्रतिबिंब दृष्टिकोण के बारे में:

private static int MySizeOf(object structure) 
{ 
    var marshalType = typeof(Marshal); 
    var genericSizeOfMethod = marshalType.GetMethod("SizeOf", Type.EmptyTypes); 
    var sizeOfMethod = genericSizeOfMethod.MakeGenericMethod(structure.GetType()); 
    var size = (int)sizeOfMethod.Invoke(null, null); 

    return size; 
} 

+1

दिलचस्प विचार, हालांकि मैं इस समस्या को हल करने के लिए एक प्रतिबिंब भरोसेमंद विधि शुरू करने के साथ पूरी तरह से सहज नहीं हूं। मुझे यह भी लगता है कि आपके कोड को कुछ अनुकूलन की आवश्यकता हो सकती है: (1) मुझे नहीं लगता कि 'Type.GetMethod' सार्वभौमिक परियोजनाओं में उपलब्ध है, आपको' SizeOf' अधिभार प्राप्त करने के लिए 'TypeInfo.DeclaredMethods' को पार करने की आवश्यकता हो सकती है; (2) मुझे लगता है कि आप 'संरचना' ऑब्जेक्ट को विधि में पारित करने का अवसर खो रहे हैं, हो सकता है कि 'आमंत्रण' कॉल में दूसरा तर्क शून्य के बजाय 'नया [] {struct} 'होना चाहिए? –

+0

यूनिवर्सल के साथ कभी काम नहीं किया, इसलिए मुझे उनके प्रतिबंधों को नहीं पता। आमंत्रण कॉल के लिए आपको संरचना को पारित करने की आवश्यकता नहीं है, क्योंकि हमने पहले ही इस प्रकार को निकाला है और सामान्य कॉल 'मार्शल। सिज़ऑफ <स्ट्रक्चर टाइप>() 'के लिए उपयोग किया है। – Oliver

+0

लेकिन क्या 'संरचना' ऑब्जेक्ट का अप्रबंधित आकार हमेशा वही है? फिर, वहां दो 'मार्शल.इजऑफ ' अधिभार 'क्यों हैं, मार्शल.इजऑफ () 'और' मार्शल .इज़ऑफ (टी) ', [4.5.1 और बाद के ढांचे में] (http: // msdn। microsoft.com/en-us/library/vstudio/system.runtime.interopservices.marshal.sizeof(v=vs.110).aspx)? और, मुझे पूरा यकीन है कि आप सार्वभौमिक प्रोजेक्ट में 'Type.GetMethod' नहीं कर सकते हैं, क्योंकि विधि आधुनिक विंडोज (f.k.a. Metro) ऐप्स के लिए उपलब्ध नहीं है। –

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