【问题标题】:Generic property- how to specify the type at run time通用属性 - 如何在运行时指定类型
【发布时间】:2011-02-21 18:22:42
【问题描述】:

我正在阅读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 包含不同类型的值,并且我想将各种Foos 放入一个集合中。换句话说,我想要一个包含不同类型对象的集合。

【问题讨论】:

    标签: c# generics casting properties


    【解决方案1】:

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

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

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

    当您将值类型转换为引用类型时,您会得到装箱,反之则得到取消装箱 - 所以这取决于您使用的类型。

    【讨论】:

    • 好的,但是我仍然必须将从 ConvertedValue 属性返回的对象转换为运行时类型...是否可以像泛型一样直接返回运行时类型中的对象?
    • @Lirik,您必须对其进行强制转换,以便编译时间成为您想要的类型。运行时类型由 ChangeType() 方法“转换”(实际转换)。在这里使用泛型的问题是您不能将泛型类型限制为 int/short/byte/double ... 您必须使用更一般的限制(使用 where 关键字),这不允许您做什么你要。我的建议是使用重载或 C#4.0 动态。
    • 我正在使用 3.5,但我还无法获得 C#4.0...重载不合适,因为我正在传递 Func 委托。 Func 委托的可能声明太多了,我无法实际编写重载(将来可能还会有更多)。我想我必须在 Foo 类的“客户端”端进行强制转换。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多