Это возможно, если класс, содержащий свойство является общим, и вы объявляете свойство с помощью универсального параметра:
class Foo<TValue> {
public string Value { get; set; }
public TValue TypedValue {
get {
return (TValue)Convert.ChangeType(Value, typeof(TValue));
}
}
}
В качестве альтернативы можно использовать общий метод вместо:
class Foo {
public string Value { get; set; }
public Type TheType { get; set; }
public T CastValue<T>() {
return (T)Convert.ChangeType(Value, typeof(T));
}
}
Вы также можете использовать классы System.ComponentModel.TypeConverter
для преобразования, поскольку они позволяют классу определять собственный преобразователь.
Edit: обратите внимание, что при вызове шаблонного метода, необходимо указать параметр универсального типа, так как компилятор не имеет возможности вывести его:
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);
int c = foo.CastValue<int>();
Вы должны знать тип во время компиляции , Если вы не знаете тип во время компиляции, то вы должны быть хранить его в object
, в этом случае вы можете добавить следующее свойство к Foo
класса:
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
Общие свойства были бы приятными; Я думаю, что `var val = obj.Prop` более краткий для поиска по типу, чем `obj.Prop [typeof (Type)]` или `obj.GetProp ()`. –
Dan
2013-01-22 19:24:41