首页 文章

通用类型转换FROM字符串

提问于
浏览
203

我有一个类,我想用它来存储另一个类的"properties" . 这些属性只具有名称和值 . 理想情况下,我想要的是能够添加类型属性,以便"value"返回始终是我想要的类型 .

类型应该始终是原始的 . 此类是一个抽象类的子类,它基本上将名称和值存储为字符串 . 这个想法是这个子类将为基类添加一些类型安全性(以及为我节省一些转换) .

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

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

所以问题是:

Is there a "generic" way to convert from string back to a primitive?

我似乎找不到任何通用的界面链接转换(像ITryParsable这样理想!) .

9 回答

  • 1

    对于许多类型(整数,双精度,日期时间等),有一个静态Parse方法 . 您可以使用反射调用它:

    MethodInfo m = typeof(T).GetMethod("Parse", new Type[] { typeof(string) } );
    
    if (m != null)
    {
        return m.Invoke(null, new object[] { base.Value });
    }
    
  • 324

    您可以使用诸如traits class之类的构造 . 通过这种方式,您将拥有一个参数化的帮助程序类,它知道如何将字符串转换为自己类型的值 . 那么你的getter可能看起来像这样:

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

    现在,我必须指出,我对参数化类型的体验仅限于C及其模板,但我想有一些方法可以使用C#泛型做同样的事情 .

  • 0
    public class TypedProperty<T> : Property
    {
        public T TypedValue
        {
            get { return (T)(object)base.Value; }
            set { base.Value = value.ToString();}
        }
    }
    

    我使用通过对象转换 . 这有点简单 .

  • 5

    然而,lubos hasko 's method fails for nullables. The method below will work for nullables. I didn'想出了它 . 我通过谷歌找到了它:http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx信用证"Tuna 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)));
        }
    }
    
  • 63

    又一种变化 . 处理Nullables,以及字符串为null且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(); }
        }
    }
    
  • 10

    我使用了lobos的答案而且很有效 . 但由于文化设置的原因,我对 doubles 的转换存在问题 . 所以我补充道

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

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

    似乎为我工作:

    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");
    }
    
  • 0

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

    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();}
        }
    }
    
  • 3
    TypeDescriptor.GetConverter(PropertyObject).ConvertFrom(Value)
    

    TypeDescriptor 是具有方法 GetConvertor 的类,它接受 Type 对象,然后您可以调用 ConvertFrom 方法来转换该指定对象的 value .

相关问题