我在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
组合到一个集合中。换句话说,我想拥有一个拥有不同类型对象的集合。
好的,但我仍然必须将从ConvertedValue属性返回的对象转换为运行时类型...是否可以直接以类似于泛型的方式在运行时类型中返回对象? – Kiril 2010-05-20 09:08:32
@Lirik,你必须投它,所以编译时间将是你想要的类型。运行时类型由ChangeType()方法“cast”(实际转换)。在这里使用泛型的问题是,你不能限制你的泛型类型为int/short/byte/double ...你必须使用更一般的限制(使用where关键字),这不允许你做什么你要。我的建议是使用重载或C#4.0动态。 – brickner 2010-05-20 09:20:17
我正在使用3.5,并且我无法获得C#4.0 ...重载不适合,因为我正在传递Func委托。 Func委托对我来说有太多可能的声明来实际编写重载(并且未来可能会有更多)。我想我必须在Foo类的“客户端”一侧进行投射。 – Kiril 2010-05-20 09:27:16