2016-08-03 14 views
2

Hier ist ein Code, um die Idee zu geben.Gibt es eine Möglichkeit, eine Vorlagenklasse an einem anonymen Typ aufzurufen?

Also V ist eine Variable eines anonymen Typs und ich möchte Klasse C mit V als Argument instanziieren. Dies erfordert ein Typargument, das ich nicht liefern kann.

Diese Frage ist ähnlich, aber die Antwort ist nicht viel Hilfe in meinem Fall: Why can't I instantiate a generic class inferring types from anonymous objects?

Die Frage hinter der Frage ist, dass ich versuche IEnumerable zu tun, was zu tun.


Sollte es klar gemacht haben: ich wirklich nicht zu tun, würde es vorziehen, von object oder Type Manipulation, weil Sie die Vorteile der starken Typisierung und Intellisense verlieren.


Für alle Interessierten, das Projekt, das diese benötigt, ist hier beschrieben: http://www.andl.org/2016/07/andl-net-making-progress/.

+0

können Sie den vollständigen Code von DevEstacion

+0

C teilen Dies könnte helfen - [Erstellen generische Klasse Instanz basierend auf Anonymous Type] (http://stackoverflow.com/questions/280172/create-generic-class-instance-based-on-anonymous-type) –

+0

Die Antwort auf die Frage, die Sie verknüpft haben, spricht über die Verwendung von Typ-Inferenz über eine Hilfsmethode: 'C MakeC (T arg) {zurückgeben C (); } '- was folgendes ermöglicht:' var X = MakeC (V); '. Wie beantwortet das deine Frage nicht? –

Antwort

4

Sie Typinferenz verwenden können, wenn Sie eine Factory-Methode haben:

public class C<T> 
{ 
    public C(T t) 
    { 
     // ... 
    } 
} 

public static class Factory 
{ 
    public static C<T> Create<T>(T t) 
    { 
     return new C<T>(t); 
    } 
} 

public class Thing 
{ 
    void Foo() 
    { 
     var x = new { y = "z" }; 
     //var thing = new C(x); - doesn't work, you need to specify the generic parameter 
     var thing = Factory.Create(x); // T is inferred here 
    } 
} 
+0

So einfach. Ja, ich kann dieses Muster mehrmals verwenden, um eine Reihe verwandter Probleme zu lösen. Warum habe ich nicht daran gedacht? Siehe Bearbeiten. –

1

Sie können das nicht tun, da V Instanz des anonymen Typs ist, nicht ein Typname selbst.

Sie diese Art dynamisch erstellen kann (vorausgesetzt, parameterlosen Konstruktor in C <>):

var X = typeof (C<>) 
      .MakeGenericType(V.GetType()) 
      .GetConstructor(Type.EmptyTypes) 
      .Invoke(new object[0]); 
+0

Sehr nicde, +1 dafür. Definitiv etwas, das ich benutzen werde, aber diesmal nicht. Siehe Bearbeiten für warum. –

0

Sie benötigen einen Typ, können Sie Pass Objekt als Typ verwenden.

Beispielcode:

public class C<T> 
{ 
    public T _t { get; set; } 

    public C(T t) 
    { 
     _t = t; 
    } 

    public void TestMethod() 
    { 
     Console.WriteLine(_t.ToString()); 
    } 
} 

public class X 
{ 
    public void M() 
    { 

     var V = new { W = 1 }; 

     var X = new C<object>(V); // everything is an object. 

     X.TestMethod(); 
    } 
} 
+0

danke, aber ich möchte wirklich das starke Tippen behalten. Siehe Bearbeiten. –

+0

@ david.pfx: Ich sehe Ihren Punkt, Glückwunsch, dass Sie die richtige Lösung gefunden haben –