2010-05-20 51 views
2

我在making a generic property阅读问题的类型,但我从first answer最后一个例子有点困惑(以下附上相关的代码):通用属性 - 如何在运行时指定

你必须知道在编译 时间的类型。如果你不知道 编译时的类型,那么你一定是存储 它在一个对象,在这种情况下,你可以 以下属性添加到富 类:

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组合到一个集合中。换句话说,我想拥有一个拥有不同类型对象的集合。

回答

2

Convert.ChangeType()决定运行时的类型。你给出的参数可以在运行时计算出来,并且可以是编译器在编译时不知道的东西。

这就是为什么它必须返回一个通用对象而不是特定类型。

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

当你将一个值类型转换为引用类型时,你可以获得装箱权,而另一种方式则可以取消装箱 - 这取决于你使用的类型。

+0

好的,但我仍然必须将从ConvertedValue属性返回的对象转换为运行时类型...是否可以直接以类似于泛型的方式在运行时类型中返回对象? – Kiril 2010-05-20 09:08:32

+0

@Lirik,你必须投它,所以编译时间将是你想要的类型。运行时类型由ChangeType()方法“cast”(实际转换)。在这里使用泛型的问题是,你不能限制你的泛型类型为int/short/byte/double ...你必须使用更一般的限制(使用where关键字),这不允许你做什么你要。我的建议是使用重载或C#4.0动态。 – brickner 2010-05-20 09:20:17

+0

我正在使用3.5,并且我无法获得C#4.0 ...重载不适合,因为我正在传递Func委托。 Func委托对我来说有太多可能的声明来实际编写重载(并且未来可能会有更多)。我想我必须在Foo类的“客户端”一侧进行投射。 – Kiril 2010-05-20 09:27:16

相关问题