我有一个类,我想用它来存储另一个类的"属性".这些属性只有名称和值.理想情况下,我想要的是能够添加类型属性,以便返回的"值"始终是我想要的类型.
类型应该始终是原始的.此类是一个抽象类的子类,它基本上将名称和值存储为字符串.这个想法是这个子类将为基类添加一些类型安全性(以及节省我的一些转换).
所以,我创建了一个类(大致)这个:
public class TypedProperty: Property { public DataType TypedValue { get { // Having problems here! } set { base.Value = value.ToString();} } }
所以问题是:
是否有一种"通用"方式从字符串转换回原语?
我似乎找不到任何通用的界面来连接整个转换(像ITryParsable这样理想!).
我不确定我是否理解你的意图,但让我们看看这个是否有帮助.
public class TypedProperty: Property where T : IConvertible { public T TypedValue { get { return (T)Convert.ChangeType(base.Value, typeof(T)); } set { base.Value = value.ToString();} } }
lubos hasko的方法因为无法控制而失败.以下方法适用于无效.不过,我没想出来.我通过Google找到了它:http: //web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx归功于"Tuna Toksoz"
用法优先:
TConverter.ChangeType(StringValue);
课程如下.
public static class TConverter { public static T ChangeType(object value) { return (T)ChangeType(typeof(T), value); } public static object ChangeType(Type t, object value) { TypeConverter tc = TypeDescriptor.GetConverter(t); return tc.ConvertFrom(value); } public static void RegisterTypeConverter () where TC : TypeConverter { TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC))); } }
对于许多类型(整数,双精度,日期时间等),有一个静态Parse方法.您可以使用反射调用它:
MethodInfo m = typeof(T).GetMethod("Parse", new Type[] { typeof(string) } ); if (m != null) { return m.Invoke(null, new object[] { base.Value }); }
TypeDescriptor.GetConverter(PropertyObject).ConvertFrom(Value)
TypeDescriptor
是具有GetConvertor
接受Type
对象的方法的类,然后您可以调用ConvertFrom
方法来转换该value
指定对象.