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.TypeConverter
Klassen 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 Foo
Klasse 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>()
.