我正在making a generic property上阅读一个问题,但我对first answer的最后一个例子感到有点困惑(我已经在下面列出了相关代码):
你必须知道编译时的类型 时间。如果您不知道类型 编译时间然后你必须存储 它在一个物体中,在这种情况下你可以 将以下属性添加到Foo 类:
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
这似乎很奇怪:它将值转换为指定的类型,但是当值存储为对象时,它将其作为对象返回。返回的对象是否仍然需要解除绑定?如果确实如此,那么为什么要打扰这种类型的转换呢?
我还试图创建一个通用属性,其类型将在运行时确定:
public class Foo
{
object Value {get;set;}
Type ValType{get;set;}
Foo(object value, Type type)
{ Value = value; ValType = type; }
// I need a property that is actually
// returned as the specified value type...
public object ConvertedValue {
get {
return Convert.ChangeType(Value, ValType);
}
}
}
是否可以制作通用属性?返回属性仍然是否需要在访问后取消装箱?
注意:我不想让Foo
通用,因为我希望Foo
包含不同类型的值,并且我想将各种Foo
放入集合中。换句话说,我想拥有一个包含不同类型对象的集合。
答案 0 :(得分:2)
Convert.ChangeType()
在运行时决定类型。您提供的参数可以在运行时计算,也可以是编译器在编译时无法知道的。
这就是它必须返回通用对象而不是特定类型的原因。
它仍然会转换类型 - 例如从int转换为double。编译时间类型为object
,但运行时类型更改。如果您在该对象上运行GetType()
,您将获得实际的运行时类型。
当你将一个值类型转换为引用类型时,你会得到拳击,而另一种方法就是取消拳击 - 所以这取决于你使用的类型。