我有一个类,我想用它来存储另一个类的“属性”。这些属性只有一个名称和一个值。理想情况下,我想要的是能够添加类型化的属性,这样返回的“值”总是我想要的类型。
类型应该始终是原语。这个类继承了一个抽象类,这个抽象类基本上将名称和值存储为字符串。这个想法是,这个子类将向基类添加一些类型安全(以及节省一些转换)。
所以,我创建了一个类,大致是这样的:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
所以问题是:
是否有一种“通用”的方法从字符串转换回原语?
我似乎找不到任何通用的接口来全面地链接转换(像ITryParsable这样的接口将是理想的!)
从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>();
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)));
}
}
检查静态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");
}