2009-06-04 5 views
7

में डायनामिक टाइपिंग मुझे पता है कि यह काम नहीं करता है, हालांकि क्या किसी के पास इसे काम करने का कोई तरीका है?सी #

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
Type objType = typObj.GetType(); 
List<objType> list = new List<objType>(); 
list.add((objType) obj); 

संपादित करें:

यहाँ वर्तमान कोड है: http://github.com/vimae/Nisme/blob/4aa18943214a7fd4ec6585384d167b10f0f81029/Lala.API/XmlParser.cs

विधि मैं कारगर बनाने के लिए प्रयास कर रहा हूँ SingleNodeCollection

आप देख सकते हैं है, यह वर्तमान में तो एक साथ काट दिया का उपयोग करता है प्रतिबिंब तरीकों।

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
List<MyType> list = new List<MyType>(); 
list.Add((MyType) obj); 

तुम सच में गतिशील मार्ग की जरूरत है, तो आप कुछ इस तरह कर सकता है::

+2

का उपयोग कर क्या क्या आप करने की कोशिश कर रहे हैं? –

+0

आप क्या हासिल करने की कोशिश कर रहे हैं? –

+2

@Daniel: ऐसा लगता है कि वह पहले से मौजूद वस्तु के प्रकार की सूची बनाने की कोशिश कर रहा है। – Welbog

उत्तर

10

यह आप एक स्पष्ट समाधान वंचित हो रहे हैं लगता है

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
Type objType = typObj.GetType(); 

Type listType = typeof(List<>); 
Type creatableList = listType.MakeGenericType(objType); 

object list = Activator.CreateInstance(creatableList); 
MethodInfo mi = creatableList.GetMethod("Add"); 
mi.Invoke(list, new object[] {obj}); 
+0

क्या यह केवल .NET 3.5 में है? – Skizz

+0

नहीं, 2.0 और उच्चतम। –

+0

कोड का अच्छा सा, बस मेरे लिए एक समस्या हल की। :) –

1

आप प्रतिबिंब की जरूरत है:

constructor = typeof (MyType).GetConstructor() // doing this from memory, the typeof might be wrong, I'm sure someone will edit it 
typObj = (MyType) constructor.Invoke() 

यह जेनरिक के लिए भी किया जा सकता है लेकिन यह थोड़ा सा ट्रिकियर है।

1

आप जेनरिक का उपयोग करके ऐसा कुछ कर सकते हैं, मुझे सच में यकीन नहीं है कि इसका क्या बिंदु होगा।

public List<T> TypedList<T>() where T : new() 
{ 
    object obj = new object(); 
    T typObj = new T(); 
    obj = typObj; 
    List<T> list = new List<T>(); 
    list.Add((T)obj); 
    return list; 
} 
0
object obj = new object(); 
Type objType = obj.GetType(); 
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType)); 
list.Add(obj); 

इस के साथ आप अगर आप सूची में कुछ ऐसा है जो objType से आबंटित नहीं है डाल करने के लिए कोशिश एक रनटाइम त्रुटि मिल जाएगा।

var obj = new MyType();

मैं हालांकि अपने प्रश्न गलतफहमी हो सकता है:

-2

मैं पूरी तरह सुनिश्चित करें कि आप क्या करने की कोशिश कर रहे हैं यह काम नहीं कर रहा हूँ, लेकिन होगा।

(मैं इस, नमूना कोड जो संकलन नहीं होगा ठीक करने के लिए टिप्पणी के लिए धन्यवाद संपादित)

+0

var obj; एक अवैध घोषणा है। var एक अंतर्निहित कीवर्ड है, जिसका अर्थ है कि संकलक यह निर्धारित करेगा कि किस प्रकार का प्रकार है। कथन var obj के साथ; कंपाइलर के पास प्रकार निर्धारित करने के लिए पर्याप्त जानकारी नहीं होगी। –

0

तेज़ Reflection.Emit Here's एक मनमाना ठोस instantiating के लिए Reflection.Emit का उपयोग करने का एक सरल उदाहरण का उपयोग किया जाएगा रनटाइम पर टाइप करें। अपने उद्देश्यों के लिए, आपको उदाहरण के तौर पर टी.क्टर की बजाय सूची के सीटीओ को कॉल करने की आवश्यकता है।

0

भले ही यह जवाब लगता है, मैं अभी भी यह नहीं मिलता है :)

नहीं यह कार्य करने के लिए सामान्य तर्क के रूप में "typeToReturn" के लिए उपयोगी हो सकते हैं?

public List<T> SingleNodeCollection<T>(String xPath, XPathNavigator navigator) 
    where T : new() 
{ 
    XPathNodeIterator nodes = navigator.Select(xPath); 
    List<T> returnedList = new List<T>(nodes.Count); 
    ... 
    T newObj = new T(); 
    ... 
    Type t = typeof(T); // need the type anyway? 
} 
0
public class myClass 
    { 
    } 

    myClass instance = new myClass(); 

    Type t = instance.GetType; 

// शीर्ष सिर्फ एक प्रकार प्राप्त करने को दिखाने के लिए है ...

public object GetListOfType(Type t) 
{ 
    Type listType = typeof(List<>); 
    var listOfType = listType.MakeGenericType(t); 

    var listOfMyClassInstance = Activator.CreateInstance(listOfType); 

    return listOfMyClassInstance; 
} 

लेकिन अंततः आप कास्ट करने के लिए है ... आपके प्रकार सीधे

List<object> listOfMyClass = GetListOfType(t); 
    listOfMyClass.Add(myClassInstance); 

    ((myClass)listOfMyClass[0]).SomeProperty