2010-01-11 15 views
6

Ho una classe:C# Proprietà con Generic Tipo

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

Quale sarà un'istanza:

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

modo da portare con me (io sono nuovo di farmaci generici), ho bisogno di un'altra classe con un proprietà di un tipo generico in modo che Property1 o Property2 può essere utilizzato per impostare Property3:

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

voglio essere in grado di:

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

vedere questa risposta: http://stackoverflow.com/questions/271347/making-a-generic-property –

+0

Grazie per il collegamento. – youwhut

risposta

6

@bytenik Penso che il mittente chieda che class3 sia definita per contenere una proprietà generica. In questo modo quando lui/lei ha una proprietà da class1 o class2 che in questo caso è una stringa/int quella proprietà di class3 potrebbe gestire entrambi i casi.

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

penso che l'intento è il manifesto vuole fare questo:

Class3.Property3 = Class2.Property2 

penso che il poster sarà necessario lanciare per digitare T per far funzionare tutto questo però.

un'occhiata al link che è stato inviato per un esempio: Making a generic property

Ecco cosa si può fare:

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

Si noti come il modello Property2 ottiene il valore di proprietà1. Devi dirgli che tipo di generico.

+0

Hai un esempio di casting? – youwhut

+0

Ho pubblicato quello che puoi fare – JonH

+0

Grazie per il tuo aiuto. Questo mi ha iniziato e il collegamento è eccellente. – youwhut

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

Riguardo alla versione modificata della questione:

Se avete bisogno di una proprietà, che può essere impostato con qualsiasi tipo, la soluzione più ragionevole qui è di usare semplicemente proprietà di tipo Oggetto. Per il compilatore C# non c'è modo di scoprire l'istanza di quale esattamente tipo hai precedentemente inserito nel setter della proprietà.

+0

ma non puoi farlo che i tipi devono essere conosciuti al momento della compilazione. – JonH

0

Penso che potresti aver frainteso i farmaci generici. Un'altra parola che potrebbe essere usata è "template" ma che viene evitata perché è usata per cose più avanzate in C++.

Di seguito creerà una classe generica di tipo T. attualmente non definito

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

Per utilizzare questo è necessario specificare il tipo mancante:

var x = new Class2<int>(); 

Questo creerà un oggetto che ha una proprietà Property3 di tipo int.

... o ...

var y = new Class2<string>(); 

Questo creerà un oggetto che ha una Property3 proprietà che è di tipo stringa.

Dalla tua domanda credo che in realtà vuoi un tipo in cui è possibile assegnare qualsiasi tipo ad esso in fase di esecuzione, ma questo non è ciò che forniscono generici.

+0

Lo fa se lo lanci! – JonH

+0

@Matt Breckon Ritengo che questo sia imbarazzante perché richiederà una certa logica per decidere quale tipo sto usando. @ JonH hai un esempio? – youwhut