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

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

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

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

所以问题是:

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

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


当前回答

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

我通过一个对象使用转换。它更简单一点。

其他回答

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

我通过一个对象使用转换。它更简单一点。

检查静态nulable . getunderlyingtype。 —如果基础类型为null,则模板参数不是Nullable,我们可以直接使用该类型 —如果底层类型不为空,则在转换中使用底层类型。

似乎对我有用:

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

我用了lobos的答案,它工作。但是由于文化设置的原因,我在转换double时遇到了一个问题。所以我补充道

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

你可能会使用诸如trait类这样的结构。通过这种方式,您将拥有一个参数化的帮助类,它知道如何将字符串转换为自己类型的值。然后你的getter可能是这样的:

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

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

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