C#合并数据对象的设计模式

C#合并数据对象的设计模式,c#,design-patterns,C#,Design Patterns,在从提要获取数据后,我填充了一堆数据对象。提要不可靠,有时会丢失数据。我需要将传入数据与我已有的数据合并。我无法找到一个易于扩展和扩展的模式 例如,我的数据模型有以下字段 DataModelExample { public string Name; public string Value; public string Extension; } 如果提要删除了字段值,那么我可以从缓存中的现有数据对象中拾取数据,并将两者合并。我有许多数据对象,其中的字段数量不一,需要执行这

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

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

DataModelExample
{
    public string Name;
    public string Value;
    public string Extension;
}
如果提要删除了字段值,那么我可以从缓存中的现有数据对象中拾取数据,并将两者合并。我有许多数据对象,其中的字段数量不一,需要执行这些操作

有什么想法吗?

一种可能的方法:

您可以更改所有属性定义,使它们都可以
为空

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

然后,从提要填充对象后,可以使用反射(请参阅)迭代所有属性,对于每个属性,如果值为null(这意味着提要删除属性),则使用缓存中的值设置它。

一种可能的方法:

您可以更改所有属性定义,使它们都可以
为空

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


然后,在从提要填充对象之后,可以使用反射(请参阅)迭代所有属性,对于每个属性,如果值为null(这意味着提要删除属性),则使用缓存中的值设置它。

代替@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;
    }
}
您需要为每个数据对象接口编写一个合并类,因此此解决方案需要比基于反射的解决方案多得多的代码。我认为你不能逃避这项工作。这是一个权衡:运行时性能与总体编码时间。老实说,除非你的用户开始抱怨,否则我会受到运行时性能的影响,但这取决于你


记住,.

代替@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;
    }
}
您需要为每个数据对象接口编写一个合并类,因此此解决方案需要比基于反射的解决方案多得多的代码。我认为你不能逃避这项工作。这是一个权衡:运行时性能与总体编码时间。老实说,除非你的用户开始抱怨,否则我会受到运行时性能的影响,但这取决于你


请记住,.

如何拾取缓存的对象?您是否可以使用
Name
将两个对象匹配在一起?我有一个带有键值映射的缓存。因此,DataModelExample类型的对象将始终具有键-DataModelExampleKey,这是我用来从缓存中获取数据的?您是否可以使用
Name
将两个对象匹配在一起?我有一个带有键值映射的缓存。因此,DataModelExample类型的对象将始终具有key-DataModelExampleKey,这是我将用于从缓存中获取数据的键。感谢您的回复。我不喜欢使用反射,因为它的性能成本太高。@user1542794好的,但是如果您的要求之一是“我有很多数据对象,其中有不同数量的字段需要执行此操作”,如果不复制,我看不到太多的可能性code@user1542794您仍然可以使用nullable技术来明确删除了哪些值,然后自己编写合并代码,而不是使用反射。只会更少maintainable@pickles是的,这都是关于可维护性的。我会在这里使用反射,我怀疑OP是在的情况下。这种方法工作得很好。然而,我一直无法获得批准的设计。第二次我用“反思”这个词时,人们难以置信地喘息着。还在努力。谢谢ken2k。谢谢你的回复。我不喜欢使用反射,因为它的性能成本太高。@user1542794好的,但是如果您的要求之一是“我有很多数据对象,其中有不同数量的字段需要执行此操作”,如果不复制,我看不到太多的可能性code@user1542794您仍然可以使用nullable技术来明确删除了哪些值,然后自己编写合并代码,而不是使用反射。只会更少maintainable@pickles是的,这都是关于可维护性的。我会在这里使用反射,我怀疑OP是在的情况下。这种方法工作得很好。然而,我一直无法获得批准的设计。第二次我用“反思”这个词时,人们难以置信地喘息着。还在努力。谢谢ken2k。