我有一个名为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]”。
答案 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等),因此您的情况也不例外。