通用属性 - 如何在运行时指定类型

时间:2010-05-20 08:46:13

标签: c# generics casting properties

我正在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放入集合中。换句话说,我想拥有一个包含不同类型对象的集合。

1 个答案:

答案 0 :(得分:2)

Convert.ChangeType()在运行时决定类型。您提供的参数可以在运行时计算,也可以是编译器在编译时无法知道的。

这就是它必须返回通用对象而不是特定类型的原因。

它仍然会转换类型 - 例如从int转换为double。编译时间类型为object,但运行时类型更改。如果您在该对象上运行GetType(),您将获得实际的运行时类型。

当你将一个值类型转换为引用类型时,你会得到拳击,而另一种方法就是取消拳击 - 所以这取决于你使用的类型。