制作一个通用属性

我有一个类存储序列化的值和types。 我想要一个属性/方法返回已经铸造的值:

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

这在C#中可能吗?

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

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

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

 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类进行转换,因为它们允许类定义它自己的转换器。

编辑 :请注意,在调用generics方法时,您必须指定genericstypes参数,因为编译器无法推断:

 Foo foo = new Foo(); foo.Value = "100"; foo.Type = typeof(int); int c = foo.CastValue<int>(); 

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

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

属性,事件,构造函数等不能是通用的 – 只有方法和types可以是通用的。 大多数情况下,这不是问题,但我同意,有时这是一个痛苦。 布兰农的回答给出了两个合理的解决方法。

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

编辑:布兰农的解决scheme有一些好主意,如何处理这个使用generics函数,而不是一个属性。