跟踪自定义对象中每个属性的属性更改

时间:2016-08-05 19:11:47

标签: c#

我已经四处寻找,但未能找到足以解决我问题的解决方案。

我有一个应用程序,我正在构建各种模型类。目前,我正在处理数据库层。我的最终目标是以下呼叫:

public void SomeMethod(ModelObject param)
{
    IEnumerable<IModelObject> results = DatabaseLayer.Get(param);
}

基本上,我想在数据库层中传递一个模型对象,并使用设置为参数的属性稍后在查询的Where子句中构造。

我的问题很简单:非可空类型。但是,我不希望将所有模型属性类型更改为

public int? intProperty { get; set; }
public DateTime? dateTimeProperty { get; set; }

我想知道是否有一种简单的方法来区分默认值和设置值以查看已更改的内容。通过属性或可能通过构造列表来跟踪属性集调用的特定于模型的逻辑。我非常反对将它们设置为可以为空的类型。

数据库Get方法的伪代码类似于:

public IEnumerable<IModelObject> Get(ModelObject param)
{
    //Iterate through ModelObject parameters to find non-default values
    //Write these into a where clause
    //Query and return IEnumerable of serialized results from database
}

如果需要更多信息,请与我们联系。谢谢!

2 个答案:

答案 0 :(得分:3)

无法区分值类型的默认值和恰好是默认值的设置值。

你要么必须使用可空类型,要么你必须做一些笨重的事情,比如为属性值变化时设置的每个属性维护一个布尔值。

我会说使用可空类型;这就是他们的目的。

答案 1 :(得分:0)

发言人:我是图书馆的作者,我将向您建议。

由于其他一些要求,我必须开发一个库来跟踪任何对象更改,因此我实施了TrackerDog,这是一个open source project hosted on GitHub

如果您想跟踪更改,请按以下步骤操作:

var config = ObjectChangeTracking.CreateConfiguration();
config.TrackThisType<YourModelClass>();

var trackableObjectFactory = config.CreateTrackableObjectFactory();

var model = new YourModelClass();
var trackableModel = config.CreateFrom(model);

// Now perform changes to the whole trackable model:
trackableModel.Text = "hello world";

// Then you can get what properties have changed whenever you want
// using an extension method to get the change tracker associated to
// your model
var changeTracker = trackableModel.GetChangeTracker();
var changedProperties = changeTracker.ChangedProperties;

// or even unchanged ones:
var unhangedProperties = changeTracker.UnchangedProperties;

我相信您应该能够通过TrackerDog来满足您的更改跟踪需求,如果您觉得需要一些新功能或增强现有功能,请随时填写问题我们可以讨论有!

您还可以follow this tutorial逐步解释所有可用功能。

关于区分值类型的默认值

TrackerDog将能够告诉您,如果该值与构造函数或初始化程序在构造时间期间设置的值不同,属性是否已更改。例如,如果属性为int并且设置为0,则之前和新值将相等,因此,它根本没有变化。顺便说一句,正如我之前所说,你可以在GitHub存储库中填写一个问题,我们可以讨论如何实现这个要求。

从我的观点来看,当属性类型为值类型时,只要设置属性就可以告诉TrackerDog你想要考虑属性是否已经改变。实现这一功能并不困难。