68 .net c# generics properties
我有一个存储序列化值和类型的类.我想要一个属性/方法返回已经铸造的值:
public String Value { get; set; }
public Type TheType { get; set; }
public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); }
Run Code Online (Sandbox Code Playgroud)
这可能在C#中吗?
Bra*_*non 104
如果包含该属性的类是通用的,并且您使用generic参数声明该属性,则可能:
class Foo<TValue> {
public string Value { get; set; }
public TValue TypedValue {
get {
return (TValue)Convert.ChangeType(Value, typeof(TValue));
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用通用方法:
class Foo {
public string Value { get; set; }
public Type TheType { get; set; }
public T CastValue<T>() {
return (T)Convert.ChangeType(Value, typeof(T));
}
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用System.ComponentModel.TypeConverter
类进行转换,因为它们允许类定义它自己的转换器.
编辑:请注意,在调用泛型方法时,必须指定泛型类型参数,因为编译器无法推断它:
Foo foo = new Foo();
foo.Value = "100";
foo.Type = typeof(int);
int c = foo.CastValue<int>();
Run Code Online (Sandbox Code Playgroud)
你必须在编译时知道类型.如果您在编译时不知道类型,那么您必须将其存储在一个中object
,在这种情况下,您可以将以下属性添加到Foo
类中:
public object ConvertedValue {
get {
return Convert.ChangeType(Value, Type);
}
}
Run Code Online (Sandbox Code Playgroud)
我不相信你在这里给出的例子是可能的。CastedValue 的类型必须在编译时定义,这意味着它不能依赖于运行时值(TheType 属性的值)。
编辑:Brannon 的解决方案对于如何使用通用函数而不是属性来处理这个问题有一些很好的想法。
归档时间: |
|
查看次数: |
88726 次 |
最近记录: |