我有一个包含2列的sql表,不包括PK等
DataType Value
--------------------------------------
System.String Demo
System.Int32 23
System.Decimal 184,54
System.DateTime 2018-04-25 08:57:27.6305273
如何动态解析Value
列中的值,作为DataType
列中指定的类型。还可以有不同的数据类型:bool,double等(始终是标准数据类型。没有海关数据类型,因此我不需要获取程序集等)
我当然可以有一个愚蠢的解决方案,例如:
object value;
if (DataType == "System.String")
{
value = Convert.ToString(XXXX);
}
是否有更好的通用方法可以动态解析此内容?
编辑:
你们怎么看?这是一个过度杀伤力吗?
Type oType = Type.GetType("System.String");
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(VALUE_IN_HERE)))
{
stream.Seek(0, SeekOriginal.Begin);
var dcs = new DataContractSerializer(oType);
return dcs.ReadObject(stream);
}
答案 0 :(得分:4)
存储数据类型似乎是一种反模式,但是您可以执行以下操作:
Type t = Type.GetType(DataType);
value = Convert.ChangeType(XXXX, t);
答案 1 :(得分:0)
首先:不要获取String输出,请尽可能使用数据读取器,Linq映射或EntityFramework来访问列。
第二:您可以使用Factory ...或缺少更好名称的某种方式来实现。
Dictionary<String,Func<String,object>> factory
添加创建类型的方法并将其返回到字典
factory["System.String"] = (s) => s;
factory["System.Int32"] (i) => Int32.Parse(i);
使它具有两个变量的 type 和 value 并只需执行
object val = factory[type](value);
您仍然没有类型信息,但可以进一步:
Dictionary<String, Action<String>> factory;
factory["System.Int32"] = i => DoSomethingGeneric(Int32.Parse(i));
factory["System.String"] = s => DoSomethingGeneric(s);
private void DoSomethingGeneric<T>(T value)
{
at least you have a type here and can do something with it
}
仍然不是很有用,但是您提到了泛型。如果您愿意独立处理值,则可以使用以下方法:
Dictionary<String, Action<String>> factory;
factory["System.Int32"] = i => DoSomethingWithInt(Int32.Parse(i));
factory["System.String"] = s => DoSomethingWithStrings(s);
答案 2 :(得分:0)
Type foo = typeof(data);
即使您使用类型object继承了data
,也会返回解析后的类型。