Jest to możliwe, jeśli klasa zawierający właściwość jest nazwą rodzajową, i zadeklarować właściwość pomocą parametru rodzajowego:
class Foo<TValue> {
public string Value { get; set; }
public TValue TypedValue {
get {
return (TValue)Convert.ChangeType(Value, typeof(TValue));
}
}
}
Alternatywą byłoby użyć metody rodzajowe Zamiast:
class Foo {
public string Value { get; set; }
public Type TheType { get; set; }
public T CastValue<T>() {
return (T)Convert.ChangeType(Value, typeof(T));
}
}
Możesz także użyć klas System.ComponentModel.TypeConverter
do konwersji, ponieważ pozwalają klasie zdefiniować własny konwerter.
Edit: zauważ, że gdy wywołanie metody rodzajowe, należy określić parametr typu rodzajowego, ponieważ kompilator nie ma sposobu, aby go wywnioskować:
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);
int c = foo.CastValue<int>();
trzeba znać typ w czasie kompilacji . Jeśli nie znasz typu w czasie kompilacji, to musisz być przechowywanie go w object
, w takim przypadku można dodać następującą właściwość do klasy Foo
:
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
Właściwości ogólne byłoby miło; Myślę, że 'var val = obj.Prop' jest bardziej zwięzły dla wyszukiwania opartego na typie niż 'obj.Prop [typeof (Type)]' lub 'obj.GetProp ()'. –
Dan