我有一个存储序列化值和类型的类.我想要一个属性/方法返回已经铸造的值:
public String Value { get; set; } public Type TheType { get; set; } public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); }
这可能在C#中吗?
如果包含该属性的类是通用的,并且您使用generic参数声明该属性,则可能:
class Foo{ 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() { 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();
你必须在编译时知道类型.如果您在编译时不知道类型,那么您必须将其存储在一个中object
,在这种情况下,您可以将以下属性添加到Foo
类中:
public object ConvertedValue { get { return Convert.ChangeType(Value, Type); } }
属性,事件,构造函数等不能是通用的 - 只有方法和类型可以是通用的.大部分时间都不是问题,但我同意有时这很痛苦.布兰农的回答给出了两个合理的解决方法.