2009-06-04 7 views
7

Je sais que cela ne fonctionne pas, mais est-ce que quelqu'un a un moyen de le faire fonctionner?Dactylographie dynamique en C#

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

EDIT:

Voici le code actuel: http://github.com/vimae/Nisme/blob/4aa18943214a7fd4ec6585384d167b10f0f81029/Lala.API/XmlParser.cs

La méthode que je vais essayer de rationaliser est SingleNodeCollection

Comme vous pouvez le voir, il utilise actuellement si piraté ensemble la réflexion méthodes

+2

Qu'est-ce que êtes-vous en train de faire? –

+0

qu'essayez-vous d'accomplir? –

+2

@Daniel: On dirait qu'il essaie de créer une liste du type d'un objet déjà existant. – Welbog

Répondre

10

Il semble que vous manque une solution évidente:

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

Si vous avez vraiment besoin de l'itinéraire dynamique, alors vous pourriez faire quelque chose comme ceci:

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

Est-ce seulement dans .Net 3.5? – Skizz

+0

Non, 2.0 et supérieur. –

+0

Un petit morceau de code, juste résolu un problème pour moi. :) –

1

Vous avez besoin de réflexion:

Cela peut également être fait pour les génériques, mais c'est un peu plus compliqué.

1

Vous pouvez faire quelque chose comme ça en utilisant Generics, je ne suis pas vraiment sûr de ce que le point serait.

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); 

Avec cela, vous obtiendrez une erreur d'exécution si vous essayez de mettre quelque chose dans la liste qui ne sont pas cessibles de objType.

-2

Je ne suis pas tout à fait sûr de ce que vous essayez de faire, mais je ce travail:

var obj = new MyType();

je pourrais être mal compris votre question cependant.

(J'ai effectué ce pour fixer un exemple de code qui ne compilera pas, merci pour le commentaire)

+0

var obj; est une déclaration invalide. var est un mot clé implicite, ce qui signifie que le compilateur déterminera le type. Avec l'instruction var obj; le compilateur n'aurait pas assez d'informations pour déterminer le type. –

0

plus rapide serait d'utiliser Reflection.Emit Here's un exemple simple d'utilisation Reflection.Emit pour instancier un béton arbitraire tapez à l'exécution. Pour vos besoins, vous avez juste besoin de l'avoir appeler le ctor de List au lieu de T.ctor comme dans l'exemple.

0

Même si elle semble répondre, je ne comprends toujours pas :)

Ne serait-il utile d'avoir le « typeToReturn » comme argument générique à la fonction?

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; 

// top est juste pour montrer l'obtention d'un type ...

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

    var listOfMyClassInstance = Activator.CreateInstance(listOfType); 

    return listOfMyClassInstance; 
} 

mais finalement vous devez jeter ... en utilisant votre type directement

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

    ((myClass)listOfMyClass[0]).SomeProperty