是否有一种优雅的方法可以将数据复制到几乎结构相同的类型?

时间:2019-02-13 23:52:23

标签: c# .net types

假设我定义了以下两种类型,第一种用于初始接收JSON,第二种表示相同的记录,但可能具有空值,并且已接收默认值:

public class JsonInputAsReceived {
    public string company { get; set; }
    public string employeeNumber { get; set; }
    public DateTime? effectiveDate { get; set; }
}

public class JsonInputWithDefaults {
    public string company { get; set; }
    public string employeeNumber { get; set; }
    public DateTime effectiveDate { get; set; }
}

这是一种应用这些默认设置的方法的实现:

public static JsonInputWithDefaults setDefaults1(JsonInputAsReceived original) {
    return new JsonInputWithDefaults {
        company = original.company,
        employeeNumber = original.employeeNumber,
        effectiveDate = original.effectiveDate ?? DateTime.Today
    };
}

这很好。但是,如果我的模型类型具有很多属性,包括嵌套的集合等,那么添加任何“有用的”代码就会变得很麻烦。

是否有任何优雅的方法来定义两个几乎相同的类型,以便我可以复制“相同”部分而不必手动对其进行编码?

我想不出的任何东西都不会(a)牺牲类型安全性(reflection,Dictionary <,>)或(b)涉及手动执行几乎复制操作。

1 个答案:

答案 0 :(得分:2)

如果您不关心原始数据结构,则可以避免编写第二个数据结构。例如,将原始类(JsonInputAsReceived)中的有效日期属性重写为

private DateTime? _effectiveDate;
public DateTime? effectiveDate 
{
       get
       {
        if(!this._effectiveDate.HasValue)
            this._effectiveDate = DateTime.Today;
        return this._effectiveDate;
       }

       set { this._effectiveDate = value; }
}

您现在可以将对象反序列化为

string json = @"{company:'abc',employeeNumber:'23'}";
var data = JsonConvert.DeserializeObject<JsonInputAsReceived>(json);

这还将确保您不必重新创建整个数据