0

我有一堆数据对象,我在从提要中获取数据后填充这些对象。提要不可靠,有时会丢失数据。我需要将传入的数据与我已有的数据合并。我无法为此找出一个易于扩展和可扩展的模式。

例如,我的数据模型有以下字段

DataModelExample
{
    public string Name;
    public string Value;
    public string Extension;
}

如果提要删除字段值,我可以从缓存中的现有数据对象中选择数据并将两者合并。我有许多数据对象,其中需要完成的字段数量不同。

有任何想法吗?

4

2 回答 2

3

一种可能的方式:

您可以更改所有属性定义,使它们都是nullable.

例如,如果您有一个public int MyInt { get; set; }属性,请将其更改为public int? MyInt { get; set; }

然后,从提要中填充对象后,您可以使用反射遍历所有属性(请参阅如何循环遍历类的所有属性?),并且对于每个属性,如果值为 null(这意味着提要删除属性),使用来自缓存的值设置它。

于 2012-08-02T15:07:48.860 回答
0

代替 @ken2k 建议的反射,您可以创建一组类来处理您的对象并在必要时合并缓存中的数据。为了尽量减少您需要的此类类的数量,我会让它们在您的数据对象将实现的接口上运行。

public interface IDataModelExample
{
    string Name { get; set; }
    string Value { get; set; }
    string Extension { get; set; }
}

public class DataModelExampleMerger
{
    public IDataModelExample Merge(IDataModelExample dme)
    {
        var cachedDme = LoadFromCache(); // This would require the key of course.
                                         // I'll leave the implementation up to 
                                         // you.

        if (string.IsNullOrEmpty(dme.Name))
        {
            dme.Name = cachedDme.Name;
        }

        // Repeat similar if-block for all properties.

        return dme;
    }
}

您需要为每个数据对象接口编写一个合并类,因此该解决方案将需要比基于反射的解决方案更多的代码。我不认为你可以绕过工作。这是一个权衡:运行时性能与整体编码时间。老实说,除非您的用户开始抱怨,否则我会对运行时性能造成影响,但这取决于您。

请记住,过早优化是万恶之源

于 2012-08-02T15:31:20.680 回答