2010-01-11 23 views
6

Tengo una clase:C# Propiedad con el tipo genérico

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

que será una instancia:

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

Así toleradme (Soy nuevo a los genéricos), necesito otra clase con una propiedad de un tipo genérico de manera que Propiedad1 o Propiedad2 puede ser usado para fijar Propiedad3:

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

quiero ser capaz de:

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

ver esta respuesta: http://stackoverflow.com/questions/271347/making-a-generic-property –

+0

Gracias por el enlace. – youwhut

Respuesta

6

@bytenik Creo que el autor está pidiendo que Class3 ser definido para contener una propiedad genérica. De esta forma, cuando tenga una propiedad de class1 o class2, que en este caso es una cadena/int, la propiedad de class3 podría manejar cualquiera de los casos.

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

creo que la intención es el cartel quiere hacer esto:

Class3.Property3 = Class2.Property2 

creo que el cartel tendrá que echarlo a tipo T para que esto funcione sin embargo.

Mira el enlace que fue publicada para un ejemplo: Making a generic property

Aquí es lo que puede hacer:

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

Aviso cómo su plantilla propiedad2 obtiene el valor de propiedad1. Tienes que decirle qué tipo de genérico.

+0

¿Tiene un ejemplo de casting? – youwhut

+0

Publiqué lo que puedes hacer – JonH

+0

Gracias por tu ayuda. Esto me hizo comenzar y el enlace es excelente. – youwhut

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

Con respecto a la versión editada de la pregunta:

Si necesita una propiedad, que se puede configurar con cualquier tipo, la solución más razonable es usar simplemente propiedad de tipo Objeto. Para el compilador de C# no hay forma de averiguar la instancia de qué tipo exactamente has insertado previamente en el establecimiento de propiedades.

+0

youwhut no puede hacer que los tipos necesitan ser conocidos en tiempo de compilación. – JonH

0

que cree que puede tener genéricos mal entendidas. Otra palabra que podría usarse es "plantilla" pero se evita porque se usa para cosas más avanzadas en C++.

Lo siguiente creará una clase genérica de un tipo T. Actualmente no definido

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

Para utilizar este tiene que especificar el tipo de falta:

var x = new Class2<int>(); 

Esto creará un objeto que tiene una propiedad Property3 que es de tipo int.

... o ...

var y = new Class2<string>(); 

Esto creará un objeto que tiene una Propiedad3 propiedad que es de tipo cadena.

De tu pregunta, creo que de verdad quieres un tipo en el que puedas asignarle cualquier tipo en tiempo de ejecución, pero esto no es lo que ofrecen los genéricos.

+0

¡Lo hace si lo lanzas! – JonH

+0

@Matt Breckon Siento que esto es incómodo porque requerirá un poco de lógica para decidir qué tipo estoy usando. @JonH ¿tiene un ejemplo? – youwhut

Cuestiones relacionadas