का उपयोग यह संभव "की तरह" है। इसमें से क्रमबद्ध करें कि आप इसे कर सकते हैं, लेकिन यह एक हैक का थोड़ा सा है।
आप सामने अपनी कक्षाओं को जानते हैं, एक स्विच बयान का उपयोग करें:
आप 3 विकल्प हैं। मूल रूप से इस तरह:
switch(str){
case "TypeRepository": return new Repository<TypeRepository>;
}
ऊपर का एक और अधिक उन्नत रूप के रूप में, आप एक hashtable
var factory = new Dictionary<string, Func<object>>();
factory.Add("TypeRepository",() => new Repository<TypeRepository>());
var theObject = factory["TypeRepository"]() as Repository<TypeRepository>;
सबसे बड़ी लचीलेपन के लिए के बजाय एक शब्दकोश का उपयोग कर सकते हैं, आप वर्गों के लिए तार मिलान करने के लिए प्रतिबिंब का उपयोग कर सकते चलने के समय पर। ध्यान रखें कि प्रतिबिंब काफी धीमा है, इसलिए यदि आप इसे किसी भी प्रकार की नियमितता से कर रहे हैं, तो आप इससे बचना चाहते हैं। उदाहरण के तौर पर, यहां Frans Bouma's विधि का उपयोग कर एक है। बस अपने कोड में Repository<>
को List<>
बदलने के लिए:
public static object MakeList(string typeStr)
{
var nameSpace = "MyTestApplication" + ".";
var objType = Type.GetType(nameSpace + typeStr); // NAMESPACE IS REQUIRED
var listType = typeof(List<>).MakeGenericType(objType);
return Activator.CreateInstance(listType);
}
var listOfThings = MakeList("MyCoolObject") as List<MyCoolObject>;
नोट: वहाँ कोई रास्ता नहीं तथ्य यह है कि इन सभी तंत्र लौट object
, जिसे फिर आप के बजाय वापस लौटाती सिर्फ दृढ़ता से टाइप किया लौटने के बाद अपने उचित प्रकार से कास्ट करने के लिए है से बचने के लिए है मान।
यह अपरिहार्य है, क्योंकि आप रनटाइम तक सूची के प्रकार को नहीं जानते हैं, और सी # संकलन समय पर चीजों को जानने के आसपास बनाया गया है (यह लोगों का मतलब है जब वे "स्थिर रूप से टाइप की गई प्रोग्रामिंग भाषा" कहते हैं)। यह सी # 4 में कम दर्दनाक होगा, जहां आप dynamic
वापस कर पाएंगे, जो आपको कास्टिंग बचाएगा।
ध्यान दें कि आप अपने प्रोग्राम में रिपोजिटरी का उल्लेख नहीं कर सकते हैं, इसलिए _rep के प्रकार को 'ऑब्जेक्ट' या कुछ रेपॉजिटरी के लिए सामान्य इंटरफ़ेस होना चाहिए। –