Es posible si la clase que contiene la propiedad es genérico, y declarar el establecimiento en el parámetro genérico:
class Foo<TValue> {
public string Value { get; set; }
public TValue TypedValue {
get {
return (TValue)Convert.ChangeType(Value, typeof(TValue));
}
}
}
Una alternativa sería utilizar un método genérico en lugar:
class Foo {
public string Value { get; set; }
public Type TheType { get; set; }
public T CastValue<T>() {
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 cuando se llama al método genérico, debe especificar el parámetro de tipo genérico, ya que el compilador no tiene forma de inferir que:
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);
int c = foo.CastValue<int>();
Usted tiene que saber el tipo en tiempo de compilación . Si no conoce el tipo en tiempo de compilación, entonces debe ser almacenarla en un object
, en cuyo caso se puede agregar la siguiente propiedad a la clase Foo
:
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
Las propiedades genéricas serían agradables; Creo que 'var val = obj.Prop' es más sucinto para una búsqueda basada en tipos que 'obj.Prop [typeof (Type)]' or 'obj.GetProp ()'. –
Dan