Có thể nếu lớp có chứa tài sản là chung chung, và bạn khai báo tài sản bằng cách sử dụng các tham số chung:
class Foo<TValue> {
public string Value { get; set; }
public TValue TypedValue {
get {
return (TValue)Convert.ChangeType(Value, typeof(TValue));
}
}
}
Một thay thế sẽ được sử dụng một phương pháp chung chung thay vì:
class Foo {
public string Value { get; set; }
public Type TheType { get; set; }
public T CastValue<T>() {
return (T)Convert.ChangeType(Value, typeof(T));
}
}
Bạn cũng có thể sử dụng các lớp học System.ComponentModel.TypeConverter
để chuyển đổi, vì chúng cho phép một lớp xác định trình chuyển đổi riêng của nó.
Sửa: lưu ý rằng khi gọi phương thức chung chung, bạn phải xác định các tham số kiểu chung chung, vì trình biên dịch không có cách nào để suy ra nó:
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);
int c = foo.CastValue<int>();
Bạn cần phải biết loại tại thời gian biên dịch . Nếu bạn không biết loại tại thời gian biên dịch sau đó bạn phải lưu trữ nó trong một object
, trong trường hợp này bạn có thể thêm thuộc tính sau vào lớp Foo
:
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
Tính chất chung sẽ tốt đẹp; Tôi nghĩ 'var val = obj.Prop' gọn gàng hơn đối với tra cứu dựa trên kiểu so với 'obj.Prop [typeof (Type)]' hoặc 'obj.GetProp ()'. –
Dan