我有一个类,我想用它来存储另一个类的“属性”。这些属性只有一个名称和一个值。理想情况下,我想要的是能够添加类型化的属性,这样返回的“值”总是我想要的类型。

类型应该始终是原语。这个类继承了一个抽象类,这个抽象类基本上将名称和值存储为字符串。这个想法是,这个子类将向基类添加一些类型安全(以及节省一些转换)。

所以,我创建了一个类,大致是这样的:

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

所以问题是:

是否有一种“通用”的方法从字符串转换回原语?

我似乎找不到任何通用的接口来全面地链接转换(像ITryParsable这样的接口将是理想的!)


当前回答

你可以在一行中完成如下:

YourClass obj = (YourClass)Convert.ChangeType(YourValue, typeof(YourClass));

快乐编码;)

其他回答

你可以在一行中完成如下:

YourClass obj = (YourClass)Convert.ChangeType(YourValue, typeof(YourClass));

快乐编码;)

Lubos hasko的方法对空值无效。下面的方法将适用于可空值。不过这不是我想出来的。我通过谷歌找到了它:http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Credit to“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)));
    }
}

对于许多类型(integer, double, DateTime等),都有一个静态Parse方法。你可以使用反射调用它:

MethodInfo m = typeof(T).GetMethod("Parse", new Type[] { typeof(string) } );

if (m != null)
{
    return m.Invoke(null, new object[] { base.Value });
}

从Bob的回答中得到灵感,这些扩展还支持空值转换和所有原语转换。

public static class ConversionExtensions
{
        public static object Convert(this object value, Type t)
        {
            Type underlyingType = Nullable.GetUnderlyingType(t);

            if (underlyingType != null && value == null)
            {
                return null;
            }
            Type basetype = underlyingType == null ? t : underlyingType;
            return System.Convert.ChangeType(value, basetype);
        }

        public static T Convert<T>(this object value)
        {
            return (T)value.Convert(typeof(T));
        }
}

例子

            string stringValue = null;
            int? intResult = stringValue.Convert<int?>();

            int? intValue = null;
            var strResult = intValue.Convert<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(); }
    }
}