Hacer una propiedad genérica

Tengo una clase que almacena un valor serializado y un tipo. Quiero tener una propiedad / método que devuelva el valor ya emitido:

public String Value { get; set; } public Type TheType { get; set; } public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); } 

¿Es esto posible en C #?

Es posible si la clase que contiene la propiedad es genérica y declara la propiedad utilizando el parámetro genérico:

 class Foo { public string Value { get; set; } public TValue TypedValue { get { return (TValue)Convert.ChangeType(Value, typeof(TValue)); } } } 

Una alternativa sería usar un método genérico en su lugar:

 class Foo { public string Value { get; set; } public Type TheType { get; set; } public T CastValue() { return (T)Convert.ChangeType(Value, typeof(T)); } } 

También puede usar las clases System.ComponentModel.TypeConverter para convertir, ya que permiten que una clase defina su propio convertidor.

Editar : tenga en cuenta que al llamar al método genérico, debe especificar el parámetro de tipo genérico, ya que el comstackdor no tiene forma de inferirlo:

 Foo foo = new Foo(); foo.Value = "100"; foo.Type = typeof(int); int c = foo.CastValue(); 

Debe saber el tipo en tiempo de comstackción. Si no conoce el tipo en tiempo de comstackción, debe almacenarlo en un object , en cuyo caso puede agregar la siguiente propiedad a la clase Foo :

 public object ConvertedValue { get { return Convert.ChangeType(Value, Type); } } 

Las propiedades, eventos, constructores, etc. no pueden ser generics; solo los métodos y tipos pueden ser generics. La mayoría de las veces eso no es un problema, pero estoy de acuerdo en que a veces es un problema. La respuesta de Brannon da dos soluciones razonables.

No creo que el ejemplo que has dado aquí sea posible. El tipo de CastedValue debe definirse en tiempo de comstackción, lo que significa que no puede depender de un valor de tiempo de ejecución (el valor de la propiedad TheType).

EDITAR: la solución de Brannon tiene algunas buenas ideas sobre cómo manejar esto usando una función genérica en lugar de una propiedad.