解析类型为字符串的动态数据

时间:2018-09-20 15:19:46

标签: c# types

我有一个包含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);
}

3 个答案:

答案 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,也会返回解析后的类型。