2010-01-11 15 views
6

Ich habe eine Klasse:C# Immobilie mit generischem Typ

public class class1 
{ 
public string Property1 {get;set;} 
public int Property2 {get;set;} 
} 

Welche instanziiert werden:

var c = new class1(); 
c.Property1 = "blah"; 
c.Property2 = 666; 

Also bei mir tragen (ich bin neu in Generika), muß ich eine andere Klasse mit einem

public class Class2 
{ 
public GenericType Property3 {get;set;} 
} 

ich möchte in der Lage sein: Eigenschaft eines generischen Typs, so dass Property1 oder Property2 kann eingestellt property3 verwendet werden

var c2 = new class2(); 
c2.Property3 = c1.Property2 // Any property of any type. 
+1

siehe diese Antwort: http://stackoverflow.com/questions/271347/making-a-generic-property –

+0

Vielen Dank für den Link. – youwhut

Antwort

6

@bytenik Ich denke, der Urheber fragt, dass Klasse3 definiert werden soll, um eine generische Eigenschaft zu enthalten. Wenn er/sie eine Eigenschaft von class1 oder class2 hat, die in diesem Fall eine Zeichenfolge/int ist, kann die Eigenschaft von class3 mit beiden Fällen umgehen.

public class Class3<T> 
{ 
public T Property3 {get;set;} 
} 

Ich denke, die Absicht ist das Plakat dies tun will:

Class3.Property3 = Class2.Property2 

denke ich das Plakat benötigt, um ihn zu spielen T für diese geben allerdings zu arbeiten.

Blick auf den Link, der für ein Beispiel gepostet: Making a generic property

Hier ist, was Sie tun können:

namespace GenericSO 
{ 
    public class Class1 
    { 
     public int property1 { get;set;} 

    } 

    public class Class2<T> 
    { 
     public T property2 { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Class1 c1 = new Class1(); 
      c1.property1 = 20; 

      Class2<int> c2 = new Class2<int>(); 

      c2.property2 = c1.property1; 
     } 
    } 
} 

Beachten Sie, wie Sie Ihre Vorlage property2 den Wert property1 bekommt. Sie müssen es sagen, welche Art von Generika.

+0

Haben Sie ein Casting-Beispiel? – youwhut

+0

Ich postete, was Sie tun können – JonH

+0

Vielen Dank für Ihre Hilfe. Das hat mich begonnen und der Link ist ausgezeichnet. – youwhut

6
public class class1<T> 
{ 
public T Property3 {get;set;} 
} 

In Bezug auf bearbeitete Version der Frage:

Wenn Sie eine Eigenschaft benötigen, die mit jeder Art eingestellt werden können, die vernünftigste Lösung ist hier einfach Eigenschaft vom Typ verwenden Objekt. Für den C# -Compiler gibt es keine Möglichkeit herauszufinden, welche Instanz genau Sie zuvor in den Property Setter geschoben haben.

+0

youwhut Sie können nicht tun, dass die Typen zur Kompilierzeit bekannt sein müssen. – JonH

0

Ich denke, Sie haben möglicherweise Generika missverstanden. Ein anderes Wort, das verwendet werden könnte, ist "Vorlage", aber das wird vermieden, weil es für fortgeschrittene Dinge in C++ verwendet wird.

Im Folgenden wird eine generische Klasse eines aktuell nicht definiert Typ T.

public class Class2<T> 
{ 
    public T Property3 { get; set; } 
} 

Um dies Sie den fehlenden Typ angeben müssen erstellen verwenden:

var x = new Class2<int>(); 

Dadurch wird ein Objekt erstellen, das hat eine Eigenschaft Property3 vom Typ int.

... oder ...

var y = new Class2<string>(); 

Dies wird ein Objekt erstellen, das eine Eigenschaft property3 hat, die vom Typ String ist.

Von Ihrer Frage glaube ich, dass Sie tatsächlich einen Typ wünschen, dem Sie zur Laufzeit einen beliebigen Typ zuweisen können, aber Generika bieten dies nicht.

+0

Es tut, wenn Sie es umwandeln! – JonH

+0

@Matt Breckon Ich fühle, dass dies peinlich ist, weil es einige Logik benötigt, um zu entscheiden, welchen Typ ich verwende. @JonH Haben Sie ein Beispiel? – youwhut

Verwandte Themen