如何在C#中将值动态转换为数据类型?

时间:2019-03-15 13:30:47

标签: c#

我有一个名为stock的对象,如下:

public class Stock
{
    public string Type  {get;set;} 
    public int? Quantity {get;set;}

    //.... It contains 25 properties
}

我需要阅读以下格式的文本文件:

<Quanity_45|Type_Abc>
<Type_Abc|Quanity_45|Reorder_4>

在文件中,每一行代表一个对象。该行包含完整的对象或某些对象属性。我需要做的是读取文件并将对象列表保存在DB中。但是我面临着动态转换属性的问题。我不想在if-else-if-else这样的代码下面做以下事情:

var columns = line.split('|');
foreach (string column in columns)
{
    string[] columnValue = column.Split('_');
    if(columnValue[0]=="Quantity")
    {
        obj.Qunaity = columnValue[1];
    }
}

如果我喜欢上面的话,那么我的类中有25个属性,并且需要使用if或switch语句进行25次。 我想要做的是获取属性名称并将其转换为所需的类型。我仅在以下字符串的情况下才这样做:

string[] columns = line.Split('|');
foreach (string column in columns)
{
    string[] columnValue = column.Split('_');
    obj.GetType().GetProperty(columnValue[0])?.SetValue(obj, columnValue[1]);
}
//Obj is my object stock

在使用字符串的情况下可以正常工作。但是,如果不是字符串,则抛出错误。我如何动态投放?

  

异常:无法将类型为“ System.String”的对象转换为类型为“ System.Nullable`1 [System.Int32]”。

1 个答案:

答案 0 :(得分:3)

您需要自己将第二部分转换为具体的强C#表示形式:

private object DeserializeValue(string input, Type toType)
{
    //here you need to deserialize 'input' string to value of 'toType' type.
    if(toType == typeof(int))
         return Int.Parse(input);
    if(toType == typeof(int?))
         return string.IsNullOrEmpty(input) ? (int?)null : Int.Parse(input);
    if(toType == typeof(string))
         return input;

    throw new NotImplementedException(toType.ToString());
}

public T Deserialize<T>(string line)
{
    if(string.IsNullOrWhitespace(line))
        return default(T);
    var obj = Activator.CreateInstance<T>();
    var columns = line.Trim('<','>').Split('|');
    foreach (var column in columns)
    {
        var columnValue = column.Split('_');
        var prop = obj.GetType().GetProperty(columnValue[0]);
        if(prop == null)
            continue;
        var value = DeserializeValue(columntValue[1], prop.PropertyType);
        prop.SetValue(obj, value);
    }
}

用法:

var stock = Deserialize<Stock>("<Type_Abc|Quanity_45|Reorder_4>");

PS :每个解串器都进行字符串转换(JSON,XML,YAML等),因此您的情况也不例外。