【问题标题】:C# string to necessary type conversionC# 字符串到必要的类型转换
【发布时间】:2015-10-04 06:58:39
【问题描述】:

我有以下情况。假设我收到字符串值列表。我必须将这些值分配给模型中的特定类型属性。 型号示例:

    public int ID { get; set; }
    public DateTime? Date { get; set; }

类型转换没有问题,因为我使用 System.reflection 获取属性类型数组并使用 Convert.ChangeType(string value, type)。 但是,我不能将 Convert.ChangeType 结果分配给模型属性,因为它返回的对象不是我想要的值类型。 我的问题的一个简短示例:

string s1 = "1";
string s2= "11-JUN-2015";
PropertyInfo[] matDetailsProperties = Model.GetType().GetProperties();
List<Type> types = new List<Type>();
        foreach(var item in Model)
        {
            types.Add(item.PropertyType);
        }

Model.ID = Convert.ChangeType(s1, types[0]);
Model.Date = Convert.ChangeType(s2, types[1]);

这不起作用,因为 Convert.ChangeType 返回对象,我不能只使用 (dateTime)Convert.ChangeType(...),这是“脏代码”,因为我有具有 17 个不同类型属性的模型。如果我可以使用 (Type[0])Convert.ChangeType(...) 那就完美了,但在 C# 中这是不可能的

【问题讨论】:

  • 这似乎是一件很奇怪的事情——你能提供一些背景信息吗?
  • 您如何知道将运行时类型为types[1]s2 分配给名为Date 的属性,但知道Date 的类型DateTime?(因此,types[1] 似乎是多余的)
  • @Damien_The_Unbeliever,他的代码确实知道。不幸的是,OP 认为仅仅写出一个简单的模型填充函数是“脏”代码,他希望通过反射来创建它。

标签: c# asp.net-mvc type-conversion typeof dynamictype


【解决方案1】:

你可以使用反射。这样的事情怎么样?

var prop = Model.GetType().GetProperty("ID");
var propValue = Convert.ChangeType(s1, types[0]);
if (prop != null && prop.CanWrite)
{
    prop.SetValue(Model, propValue, null);
}

【讨论】:

  • 谢谢你,它有效(通过反射分配价值),你 DA MVP。
【解决方案2】:

我建议你使用 TryParse(string, out DateTime) 而不是 Parse

int tempId=default(int);
DateTime tempDate=DateTime.Min;

int.TryParse(s1,out tempId);
DateTime.TryParse(s2,out tempDate);

Model.ID = tempId;
Model.Date = tempDate;

【讨论】:

  • 您不需要指定tempIdtempDate,因为out 调用将肯定设置它。
【解决方案3】:

您不需要使用Convert.ChangeType。只需使用函数内的现有解析器以简单易懂的方式创建模型:

private static Model PopulateModel(IEnumerable<string> rawData)
{
    return new Model
    {
        ID = int.Parse(rawData[0]),
        Date = DateTime.Parse(rawData[1]),
        ...
    };
}

【讨论】:

  • 你没有明白,我有 17 个属性,这意味着,在我写 int.Parse、date.Parse 等的地方会有 17 行脏代码
  • @ArvilsM,哦,但我明白了。与其尝试想出一些“聪明”的反射、转换、类型数组等技巧(这使得每个代码都难以阅读),不如在一个函数中有 17 行显式转换每种类型。它简单、易读、易维护。您对“脏”代码的定义非常奇怪,因为它实际上是一个非常干净的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2014-08-22
  • 2014-12-08
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多