2008-09-09 13 views
9

के साथ सामान्य वर्गों का उपयोग करना मेरे पास एक सामान्य रेपॉजिटरी < टी > कक्षा है जिसे मैं ऑब्जेक्टडेटा स्रोत के साथ उपयोग करना चाहता हूं। रिपोजिटरी < टी > डेटाएप नामक एक अलग परियोजना में रहता है। this post from the MS newsgroups (प्रासंगिक नीचे की नकल की भाग) के अनुसार:ऑब्जेक्टडेटा स्रोत

आंतरिक रूप से, ObjectDataSource (स्ट्रिंग) Type.GetType बुला रहा है प्रकार प्राप्त करने के लिए, तो हम पर कैसे लिए दिशानिर्देश Type.GetType में दर्ज पालन करने की आवश्यकता जेनेरिक का उपयोग कर प्रकार प्राप्त करें। दस्तावेज़ से

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

, तुम सीखना होगा कि आप (`) को बैकटिक उपयोग करने की आवश्यकता प्रकार का नाम जो जेनरिक उपयोग कर रहा है को दर्शाता है: आप Type.GetType पर MSDN लाइब्रेरी का उल्लेख कर सकते।

इसके अलावा, हमें टाइप नाम स्ट्रिंग में असेंबली नाम निर्दिष्ट करना होगा।

TypeName = "TestObjectDataSourceAssembly.MyDataHandler`1 [System.String], TestObjectDataSourceAssembly"

ठीक है, समझ में आता है:

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

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" /> 

: जब मैं यह कोशिश है, तथापि, पेज एक अपवाद फेंकता [InvalidOperationException:। प्रकार ObjectDataSource 'MyDataSource' की TypeName संपत्ति में निर्दिष्ट नहीं पाया जा सका]

उत्सुक बात यह है कि यह तब होता है जब मैं पृष्ठ देख रहा हूं। जब मैं वीएस -2008 डिजाइनर से "डेटा स्रोत कॉन्फ़िगर करें" संवाद खोलता हूं, तो यह मुझे मेरे जेनेरिक रिपोजिटरी क्लास पर उचित तरीके से दिखाता है। TypeName स्ट्रिंग को Type.GetType() पर पास करते हुए डिबगिंग भी वैध प्रकार देता है। तो क्या देता है?

उत्तर

13

ऐसा कुछ करें।

Type type = typeof(Repository<MessageCategory); 
string assemblyQualifiedName = type.AssemblyQualifiedName; 

असेंबली QualifiedName का मान प्राप्त करें और इसे TypeName फ़ील्ड में पेस्ट करें। ध्यान दें कि Type.GetType (स्ट्रिंग),

प्राप्त करने के लिए प्राप्त होने वाले मान का होना चाहिए। AssemblyQualifiedName देखें। यदि प्रकार वर्तमान में निष्पादित असेंबली में है या Mscorlib.dll में है, तो यह अपने नामस्थान द्वारा योग्य प्रकार के नाम की आपूर्ति करने के लिए पर्याप्त है।

तो, यह आपके कोड में उस स्ट्रिंग में गुजरकर काम कर सकता है, क्योंकि वह वर्ग वर्तमान में निष्पादित असेंबली (जहां आप इसे कॉल कर रहे हैं) में है, जहां ऑब्जेक्टडेटा स्रोत नहीं है।

सबसे अधिक संभावना प्रकार आप देख रहे हैं

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null 
+0

<% Response.Write (टाइपऑफ (YourClassName) .AssemblyQualifiedName); %> –

0

डैरेन,

कई, अपनी पोस्ट के लिए बहुत धन्यवाद है। मैं पूरे दिन इस साथ लड़ रहा हूं।आश्चर्यजनक रूप से, मेरे मामले में, मुझे स्क्वायर ब्रैकेट को दोहराना होगा, उदा। कोड के आपके टुकड़े के लिए:

MyProject.Repository`1 [[MyProject.MessageCategory, DataAccess, Version = 1.0.0.0, संस्कृति = तटस्थ, PublicKey = null]], डेटाएप, संस्करण = 1.0.0.0, संस्कृति = तटस्थ , PublicKey = अशक्त

रोजर

1

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन मैं हाल ही में इस समस्या को अपने आप को पड़ा है। ऑब्जेक्ट संरचना के साथ विरासत को प्रतिस्थापित करना एक और समाधान होगा, उदा।

[DataObject] 
public class DataAccessObject { 
    private Repository<MessageCategory> _repository; 

    // ctor omitted for clarity 
    // ... 

    [DataObjectMethod(DataObjectMethodType.Select)] 
    public MessageCategory Get(int key) { 
     return _repository.Get(key); 
    } 
} 

इस तरह ऑब्जेक्टडेटा स्रोत को भंडार के बारे में पता नहीं है क्योंकि यह कक्षा के भीतर छिपा हुआ है। मेरे पास मेरी मुखौटा परत में एक क्लास लाइब्रेरी है जो इस कोड को उस प्रोजेक्ट में रखने के लिए एक बिल्कुल उचित जगह है जिस पर मैं काम कर रहा हूं।

इसके अतिरिक्त, यदि आप Resharper और इंटरफेस का उपयोग कर रहे हैं, तो Resharpers "फ़ील्ड का उपयोग करके कार्यान्वित करें" फ़ंक्शन का उपयोग करके रिफैक्टरिंग करने के लिए रिशेर्पर प्राप्त करना संभव है।