2012-02-06 24 views
9

में कनवर्ट टाइप करें मैं जेनेरिक टाइप डेफिनिशन में System.Type को कन्वर्ट करना चाहता हूं, इसलिए मैं जेनेरिक विधियों को कॉल करने के लिए इसका उपयोग कर सकता हूं। मूल रूप से typeof के विपरीत।जेनेरिक क्लास डेफिनिशन

public class BaseAppContext { 

    private Type settingsType; 

    public Type SettingsType 
    { 
     get { return this.settingsType; } 
     set { this.SettingsType = value; } 
    }  

    public void MyFunction() { 
     MyStaticClass.GetData<classof(this.SettingsType)>(); 
    } 
} 

बस कुछ और जानकारी:

उदाहरण (मैं "classof" जहाँ मैं वास्तविक समाधान की आवश्यकता होगी, ताकि आप, देख जहां मैं एक समस्या मिल गया के रूप में classof कोई वास्तविक नेट तरीका नहीं है प्रयोग किया जाता) मैं समस्या को संभालने के लिए इस अजीब तरीके का उपयोग क्यों कर रहा हूं। BaseAppContext एक वर्ग है जिसे कई अन्य वर्गों द्वारा प्रस्तुत किया जाता है। अगर मैं इसे जेनेरिक बनाउंगा तो इसका मतलब यह होगा कि कोड के कई अन्य हिस्सों में बदलाव आएगा, जो मैं नहीं चाहता हूं। मैं एक ढांचा लिख ​​रहा हूं, इसलिए मैं एक बार टाइप को इनपुट करने के लिए ढांचे के लिए चाहता हूं, और डेवलपर्स केवल एक विधि को कॉल करने का प्रयास करते समय हर प्रकार के प्रकार से निपटने के बिना उपलब्ध कार्यों का उपयोग कर सकते हैं।

+0

यह समझ में नहीं आता है। आप 'सूची ' के साथ क्या करने में सक्षम होंगे? बाधाओं के बारे में क्या? – SLaks

उत्तर

3

यह मूल रूप से असंभव है।
जेनिक्स फॉर्म संकलन-समय प्रकार; आप केवल एक रनटाइम पर ज्ञात प्रकार से संकलन-समय प्रकार नहीं बना सकते हैं।

इसके बजाय, आपको प्रतिबिंब का उपयोग करने की आवश्यकता है, या एक अलग डिजाइन (उदाहरण के लिए, एक गैर-सामान्य विधि) का उपयोग करने की आवश्यकता है।

+0

लक्स, [यह] (http://stackoverflow.com/questions/31771628/getting-the-dbcontext-dbsets-using-reflection-and-having-a-cast-to-the-proper-ge) संबंधित लगता है, मुझे कैसे आगे बढ़ना चाहिए ? – Veverke

2

इस लक्ष्य को हासिल करने के लिए, आप प्रतिबिंब का उपयोग करना होगा:

public void MyFunction() { 
    var method = typeof(MyStaticClass).GetMethod("GetData").MakeGenericMethod(SettingsType); 
    method.Invoke(null, null); 
} 

हालांकि, मैं यह कर की सिफारिश नहीं होगा और इसके बजाय अपने समाधान की पुनः रचना की सलाह देंगे। प्रतिबिंब का उपयोग करना मतलब है कि आप भाषा की सभी सुंदर संकलन समय सुरक्षा को याद करते हैं। यह आम तौर पर अधिक भंगुर, कम रखरखाव कोड की ओर जाता है।

4

यह संभव नहीं होगा, क्योंकि SettingsType रनटाइम पर सेट है और <> के बीच कोड संकलित है।

आप इस तरह अपने प्रकार का एक उदाहरण बना सकते हैं:

var type = Type.GetType(SettingsType); 
var inst = Activator.CreateInstance(type); 

और एक इंटरफेस या आधार वर्ग के लिए inst डाली।

चूंकि आप एक स्थिर वर्ग का उपयोग कर रहे हैं, अमीर का जवाब बेहतर है।

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