genericstypes转换FROMstring

我有一个类,我想用来存储“属性”为另一个类。 这些属性只是一个名称和一个值。 理想情况下,我希望能够添加types属性,以便返回的“值”始终是我希望的types。

types应该始终是一个原始的。 这个类inheritance了一个抽象类,它基本上把string的名字和值存储起来。 这个想法是,这个子类将添加一些types安全的基类(以及节省我的一些转换)。

所以,我创build了一个类(大致)这个:

public class TypedProperty<DataType> : Property { public DataType TypedValue { get { // Having problems here! } set { base.Value = value.ToString();} } } 

所以问题是:

有一种“通用”的方式来从string转换回原始?

我似乎无法find任何通用的接口来连接整个板上的转换(像ITryParsable这样的理想!)。

我不确定我是否正确理解了你的意图,但是让我们看看这个是否有帮助。

 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();} } } 

lubos hasko的方法不能用于空值。 下面的方法将工作为可空。 虽然我没有拿出来。 我通过Googlefind它: http ://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx信用“金枪鱼Toksoz”

用法第一:

 TConverter.ChangeType<T>(StringValue); 

这个class级在下面。

 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))); } } 

对于许多types(整数,双精度,DateTime等),有一个静态的Parse方法。 你可以使用reflection来调用它:

 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

你可以使用一个构造,如特质类 。 这样,你将有一个参数化的帮助类,知道如何将string转换为它自己的types的值。 那么你的getter可能看起来像这样:

 get { return StringConverter<DataType>.FromString(base.Value); } 

现在,我必须指出,我在参数化types方面的经验仅限于C ++及其模板,但是我想有一些方法可以使用C#generics来做同样的事情。

检查静态Nullable.GetUnderlyingType 。 – 如果基础types为null,那么模板参数不是Nullable ,我们可以直接使用该types – 如果基础types不为null,则在转换中使用基础types。

似乎为我工作:

 public object Get( string _toparse, Type _t ) { // Test for Nullable<T> and return the base type instead: Type undertype = Nullable.GetUnderlyingType(_t); Type basetype = undertype == null ? _t : undertype; return Convert.ChangeType(_toparse, basetype); } public T Get<T>(string _key) { return (T)Get(_key, typeof(T)); } public void test() { int x = Get<int>("14"); int? nx = Get<Nullable<int>>("14"); } 
 public class TypedProperty<T> : Property { public T TypedValue { get { return (T)(object)base.Value; } set { base.Value = value.ToString();} } } 

我使用转换通过一个对象。 这有点简单。

我用lobos答案,它的作品。 但是由于文化背景的原因,我遇到了双打转换的问题。 所以我补充说

 return (T)Convert.ChangeType(base.Value, typeof(T), CultureInfo.InvariantCulture); 

又一个变化。 处理Nullables,以及string为空且T 不为空的情况。

 public class TypedProperty<T> : Property where T : IConvertible { public T TypedValue { get { if (base.Value == null) return default(T); var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); return (T)Convert.ChangeType(base.Value, type); } set { base.Value = value.ToString(); } } }