2009-05-27 14 views
13

Ich habe eine Frage darüber, wie es möglich ist ( ), eine Typreferenz von Type.GetType() zu verwenden, um zum Beispiel IList zu erstellen von diesem Typ?Verwendung von type.GetType() in c zurückgegebenen #

ist hier Beispielcode:

Type customer = Type.GetType("myapp.Customer"); 
IList<customer> customerList = new List<customer>(); // got an error here =[ 

Vielen Dank im Voraus!

+0

IList ist eine Schnittstelle, so dass Sie es nicht neu. Sie müssen einen Typ neu implementieren, der IList wie List implementiert. –

Antwort

21

Etwas wie folgt aus:

Type listType = typeof(List<>).MakeGenericType(customer); 
IList customerList = (IList)Activator.CreateInstance(listType); 

Natürlich kann man es nicht erklären kann als

IList<customer> 

, weil es nicht bei der Kompilierung definiert ist. Aber List<T> implementiert IList, also können Sie dies verwenden.

+3

Ja, da es nicht zur Kompilierzeit definiert ist, ist es nicht sinnvoll, eine generische List <> zu verwenden - Sie können auch einen nicht generischen Container wie ArrayList verwenden. – Grokys

+0

Eigentlich sollte das Ergebnis von Activator.CreateInstance auf IList übertragen werden, da es ein Objekt zurückgibt ... –

+1

@Thomas: Danke, behoben. @ Groky: Es kommt darauf an. Mit der generischen Liste erhalten Sie beim Hinzufügen von Elementen Laufzeitprüfungen. Oder Sie müssen es einem Feld zuweisen, von dem Sie wissen, dass es vom selben Typ ist. –

0

Die Lösung für Ihr Problem wird von Stefan bereits zur Verfügung gestellt.

Der Grund, warum Sie nicht tun können, ist, weil Sie auf diese Weise Compilierungszeit und Laufzeittypen nicht mischen können. Ein Tipp, wenn ich versuche, über so etwas zu argumentieren ist: Wie kann Intellisense herausfinden, welche Mitglieder es zeigen muss. In Ihrem Beispiel kann dies nur zur Laufzeit gelöst werden.

Die Antwort von Stefan, kann verwendet werden. Aber ich denke, es hilft nicht in Ihrem zugrunde liegenden Problem, denn es gibt Ihnen keine Intellisense. Ich denke, Sie haben keinen Vorteil gegenüber der Verwendung nur einer nicht-generischen Liste.

+0

Wie Stefan in den Kommentaren auf seine Antwort hingewiesen hat, gibt es immer noch Vorteile, wie zum Beispiel die generische Liste, die verhindert, dass der Code Objekte verschiedener Typen zur Liste hinzufügt. Sie verlieren jedoch intellisense. –

2

Ich vor kurzem konfrontiert mit diesem Problem..ich weiß, das ist eine alte Frage, aber dachte jemand könnte nützlich finden die Lösung, die ich gefunden (mit net 4.0). Dies ist die Setup ich hatte:

public interface ISomeInterface{ 
    String GetEntityType{ get; } 
} 

public abstract class BaseClass : ISomeInterface{ 
    public String GetEntityType { 
      get{ return this.GetType().ToString(); } 
    } 
} 

public class ChildA : BaseClass { } 

public class ChildB : BaseClass { } 

Was ich tat, war eine Factory-Methode erstellen:

public static dynamic GetRealType { ISomeInterface param } { 
    return Activator.CreateInstance("dllname", param.GetEntityType); 
} 

Erstellen Sie das Objekt als ein dynamischer Typ war, was es für mich gelöst. Ich gefolgert den Typ durch ein Verfahren mit:

public void DoSomething<T>(T param){ 

    IList<T> list = somecode... 
} 

diese mir einen Aufruf der Methode erlaubt zu tun und lassen .net

public void myMethod(ISomeInterface param) { 
    dynamic value = Factory.GetRealType (param); 
    DoSomething(value); 
} 

Hoffnung den Typ ableiten, ich habe nicht machen es verwirrend und es hilft tatsächlich auch, tut mir leid für die Wand des Textes

Verwandte Themen