字符串的通用类型转换
时间:2020-03-05 18:39:07 来源:igfitidea点击:
我有一个要用于存储另一个类的"属性"的类。这些属性仅具有名称和值。理想情况下,我希望能够添加类型化的属性,以便返回的"值"始终是我想要的类型。
该类型应始终为原始类型。该类继承了一个抽象类,该抽象类基本上将名称和值存储为字符串。这个子类的想法是为基类增加了一些类型安全性(以及为我节省了一些转换)。
因此,我创建了一个(大致)这样的类:
public class TypedProperty<DataType> : Property { public DataType TypedValue { get { // Having problems here! } set { base.Value = value.ToString();} } }
所以问题是:
有没有从字符串转换回原始类型的"通用"方法?
我似乎找不到任何通用的接口来链接转换过程(像ITryParsable这样的东西会很理想!)。
解决方案
回答
我们可以使用诸如traits类之类的构造。这样,我们将拥有一个参数化的帮助程序类,该类知道如何将字符串转换为其自身类型的值。然后getter可能如下所示:
get { return StringConverter<DataType>.FromString(base.Value); }
现在,我必须指出,我对参数化类型的经验仅限于C ++及其模板,但我想有某种方法可以使用Cgenerics进行相同的操作。
回答
我不确定我是否正确理解了意图,但让我们看看这是否有帮助。
public class TypedProperty<T> : Property where T : IConvertible { public T TypedValue { get { return (T)Convert.ChangeType(base.Value, typeof(T)); } set { base.Value = value.ToString();} } }
回答
对于许多类型(整数,双精度,DateTime等),有一个静态的Parse方法。我们可以使用反射来调用它:
MethodInfo m = typeof(T).GetMethod("Parse", new Type[] { typeof(string) } ); if (m != null) { return m.Invoke(null, new object[] { base.Value }); }
回答
lubos hasko的方法对于可为空的方法失败。以下方法适用于可为null的对象。不过,我没有提出。我通过Google找到了它:http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx归功于"金枪鱼Toksoz"
用法优先:
TConverter.ChangeType<T>(StringValue);
班级在下面。
public static class TConverter { public static T ChangeType<T>(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<T, TC>() where TC : TypeConverter { TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC))); } }
回答
public class TypedProperty<T> : Property { public T TypedValue { get { return (T)(object)base.Value; } set { base.Value = value.ToString();} } }
我通过对象使用转换。这有点简单。