制作通用财产

时间:2008-11-07 05:57:37

标签: c# .net generics properties

我有一个存储序列化值和类型的类。我想让一个属性/方法返回已经输出的值:

public String Value { get; set; }

public Type TheType { get; set; }

public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); }

这在C#中是否可行?

3 个答案:

答案 0 :(得分:98)

如果包含该属性的类是通用的,并且您使用泛型参数声明该属性,则可能是这样的:

class Foo<TValue> {
    public string Value { get; set; }
    public TValue TypedValue {
        get {
            return (TValue)Convert.ChangeType(Value, typeof(TValue));
        }
    }
}

另一种方法是使用通用方法:

class Foo {
    public string Value { get; set; }
    public Type TheType { get; set; }

    public T CastValue<T>() {
         return (T)Convert.ChangeType(Value, typeof(T));
    }
}

您也可以使用System.ComponentModel.TypeConverter类进行转换,因为它们允许类定义自己的转换器。

编辑:请注意,在调用泛型方法时,必须指定泛型类型参数,因为编译器无法推断它:

Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);

int c = foo.CastValue<int>();

您必须在编译时知道类型。如果您在编译时不知道类型,那么您必须将其存储在object中,在这种情况下,您可以将以下属性添加到Foo类:

public object ConvertedValue {
    get {
        return Convert.ChangeType(Value, Type);
    }
}

答案 1 :(得分:54)

属性,事件,构造函数等不能是通用的 - 只有方法和类型可以是通用的。大部分时间都不是问题,但我同意有时这很痛苦。布兰农的回答给出了两个合理的解决方法。

答案 2 :(得分:3)

我不相信你在这里给出的例子是可能的。必须在编译时定义CastedValue的类型,这意味着它不能依赖于运行时值(TheType属性的值)。

编辑:Brannon的解决方案对于如何使用泛型函数而不是属性来处理这个问题有一些好主意。