2011-01-19 36 views
5

मैं सम्मिलित के लिए एक WCF सेवा लिख ​​सकते हैं और यहाँ हटाने की कार्रवाई हम सामान्य विधि का इस्तेमाल किया, लेकिन यह त्रुटि निम्नलिखित देता है "System.Runtime.Serialization.InvalidDataContractException: प्रकार 'टी' एक स्कीमा के रूप में निर्यात नहीं किया जा सकता टाइप करें क्योंकि यह एक खुला सामान्य प्रकार है। यदि आप इसके सामान्य जेनेरिक पैरामीटर प्रकार वास्तविक प्रकार हैं तो आप केवल एक सामान्य प्रकार का निर्यात कर सकते हैं। "WCF उजागर सामान्य प्रकार 'टी'

यहाँ "EntityBase2" सभी संस्थाओं

[ServiceContract] 
[ServiceKnownType(typeof(EntityBase2))] 
public interface IBackupUtility 
{ 
    [OperationContract] 
    void Delete<T>(T entity) where T : EntityBase2; 

    [OperationContract] 
    void InsertORUpdate<T>(T entity) where T : EntityBase2;   
} 

प्रश्न कैसे मैं सामान्य प्रकार 'टी' का पर्दाफाश कर सकते हैं के लिए आधार वर्ग है?

+0

[डब्ल्यूसीएफ के संभावित डुप्लिकेट। सेवा जेनेरिक तरीकों] (http://stackoverflow.com/questions/2906694/wcf-service-generic-methods) – decyclone

उत्तर

7

मुझे लगता है कि यह imposible है, यह कैसे wsdl कि जिस तरह से उत्पन्न कर सकता है?

  • आप एक पैरामीटर के रूप प्रकार भेज सकते हैं:

    आपके पास दो विकल्प।

  • आप संस्थाओं के लिए CRUD संचालन बेनकाब करने के लिए चाहते हैं, तो मैं एक कोड जनरेटर, एफई के लिए शायद एक टी -4 टेम्पलेट का उपयोग करने की सिफारिश करेंगे।

+0

+1 @ पाब्लो सही है। आप सामान्य प्रकार का उपयोग नहीं कर सकते हैं। –

+0

धन्यवाद पाब्लो कास्टिला – Vikram

6

इस पोस्ट में वास्तव में पुराना है, लेकिन शायद किसी को इस समाधान उपयोगी पाते हैं: संभावित ग्राहक के लिए सर्वर भावी के लिए इस सवाल यह है कि दोनों हाँ करने के लिए WCF and Generics

+0

बिल्कुल सही। महत्वपूर्ण मदद की! – Dann

+0

हैश को हटाने के तरीके पर उस लेख में सहायक संकेत![डेटाकंट्रैक्ट (नाम = "MyGenericObjectUsing {0}"] सार्वजनिक वर्ग MyGenericObject Daniel

1
  1. उत्तर और नहीं। हां और नहीं।
  2. हम सर्वर पर एक सामान्य डेटा अनुबंध बना सकते हैं, लेकिन किसी भी आपरेशन अनुबंध में है कि का उपयोग करते समय हम सामान्य के एक डेटा प्रकार निर्दिष्ट करना होगा।
  3. और ग्राहक अंत में डेटा अनुबंध केवल दृढ़ता से डेटा प्रकार के रूप में उजागर नहीं किया जाएगा जो सामान्य नहीं है।

    [DataContract] 
    public class MyGenericObject<T> 
    { 
        private T _id; 
    
        [DataMember] 
        public T ID 
        { 
         get { return _id; } 
         set { _id = value; } 
        } 
    } 
    
    [OperationContract] 
    MyGenericObject<int> GetGenericObject(); 
    

इसी को हम सर्वर सामान्य डेटा अनुबंध हम प्रकार निर्दिष्ट करने के लिए है का उपयोग करते समय अन्यथा यह संकलन समय त्रुटि दे देंगे हम देख सकते हैं में है।

ग्राहक पर क्या हम डबल्यूएसडीएल से प्राप्त एक अनुवर्ती है:

[DataContract] 
public class MyGenericObjectOfint 

हम यहाँ देख सकते हैं कि हम क्या डबल्यूएसडीएल से प्राप्त एक सामान्य डेटा अनुबंध डबल्यूएसडीएल प्रॉक्सी एक नए नाम के साथ एक वर्ग कुछ का उपयोग कर उत्पन्न नहीं है सम्मेलन।

इस्तेमाल किया कन्वेंशन

जेनेरिक वर्ग नाम + "का" + प्रकार पैरामीटर का नाम + हैश

हैश हमेशा उत्पन्न नहीं कर रहा है, तो इसे जनरेट लिया जाएगा, जब वहाँ नाम टक्कर का एक मौका है ।

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