Es ist möglich, wenn die Klasse, die die Eigenschaft enthält, generisch ist und Sie die Eigenschaft mit dem generischen Parameter deklarieren:
class Foo<TValue> {
public string Value { get; set; }
public TValue TypedValue {
get {
return (TValue)Convert.ChangeType(Value, typeof(TValue));
}
}
}
Eine Alternative wäre, stattdessen eine generische Methode zu verwenden:
class Foo {
public string Value { get; set; }
public Type TheType { get; set; }
public T CastValue<T>() {
return (T)Convert.ChangeType(Value, typeof(T));
}
}
Sie können die System.ComponentModel.TypeConverterKlassen auch zum Konvertieren verwenden, da sie es einer Klasse ermöglichen, ihren eigenen Konverter zu definieren.
Bearbeiten : Beachten Sie, dass Sie beim Aufrufen der generischen Methode den generischen Typparameter angeben müssen, da der Compiler keine Möglichkeit hat, darauf zu schließen:
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);
int c = foo.CastValue<int>();
Sie müssen den Typ beim Kompilieren kennen. Wenn Sie den Typ zur Kompilierungszeit nicht kennen, müssen Sie ihn in einem speichern object. In diesem Fall können Sie der FooKlasse die folgende Eigenschaft hinzufügen :
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
var val = obj.Prop<Type>ist prägnanter für eine typbasierte Suche alsobj.Prop[typeof(Type)]oderobj.GetProp<Type>().