Це можливо, якщо клас, що містить властивість, є загальним, і ви оголошуєте властивість за допомогою загального параметра:
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
класи для перетворення, оскільки вони дозволяють класу визначати власний перетворювач.
Змінити : зауважте, що під час виклику загального методу ви повинні вказати загальний параметр типу, оскільки компілятор не має можливості зробити висновок:
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<Type>
, що для пошуку на основі типу більш стислим, ніжobj.Prop[typeof(Type)]
абоobj.GetProp<Type>()
.