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

C# 跟踪自定义对象中每个属性的属性更改,c#,C#,我到处寻找,但没有找到一个解决方案,充分解决我的问题 我正在用各种模型类构建一个应用程序。目前,我正在数据库层工作。我的最终目标是: public void SomeMethod(ModelObject param) { IEnumerable<IModelObject> results = DatabaseLayer.Get(param); } 我想知道是否有一种简单的方法来区分默认值和设置值,以查看更改了什么。通过属性或通过构建列表跟踪属性集调用的特定于模型的逻辑。我非

我到处寻找,但没有找到一个解决方案,充分解决我的问题

我正在用各种模型类构建一个应用程序。目前,我正在数据库层工作。我的最终目标是:

public void SomeMethod(ModelObject param)
{
    IEnumerable<IModelObject> results = DatabaseLayer.Get(param);
}
我想知道是否有一种简单的方法来区分默认值和设置值,以查看更改了什么。通过属性或通过构建列表跟踪属性集调用的特定于模型的逻辑。我非常反对将它们设置为可为null的类型

数据库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
}
public IEnumerable Get(ModelObject参数)
{
//遍历ModelObject参数以查找非默认值
//把这些写在where子句中
//从数据库中查询并返回序列化结果的IEnumerable
}

如果需要更多信息,请告诉我。谢谢

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

您要么必须使用可为null的类型,要么必须做一些笨拙的事情,比如为每个属性维护一个布尔值,当属性值更改时,这些属性将被设置


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

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

您要么必须使用可为null的类型,要么必须做一些笨拙的事情,比如为每个属性维护一个布尔值,当属性值更改时,这些属性将被设置

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

Disclamer:我是我要向你们推荐的图书馆的作者


由于其他一些要求,我必须开发一个库来跟踪任何对象的更改,所以我实现了这个库,这是一个很好的例子

如果要跟踪更改,只需执行以下步骤即可:

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;
var config=ObjectChangeTracking.CreateConfiguration();
config.TrackThisType();
var trackableObjectFactory=config.CreateTrackableObjectFactory();
var model=新的YourModelClass();
var trackableModel=config.CreateFrom(model);
//现在对整个可跟踪模型执行更改:
trackableModel.Text=“hello world”;
//然后,您可以随时获取已更改的属性
//使用扩展方法获取与关联的更改跟踪器
//你的模型
var changeTracker=trackableModel.GetChangeTracker();
var changedProperties=changeTracker.changedProperties;
//甚至是不变的:
var unhangedProperties=changeTracker.UnchangedProperties;
我相信您应该能够满足您的更改跟踪需求,如果您觉得您需要一些新功能或增强现有功能,请随时填写问题,我们可以在那里讨论

您还可以一步一步地解释所有可用功能

关于区分值类型的默认值 TrackerDog将能够告诉您,如果某个属性的值与在构造期间使用构造函数或初始值设定项设置的值不同,则该属性是否已更改。例如,如果一个属性是
int
,并且它被设置为
0
,则上一个值和新值将相等,因此,它根本没有更改。顺便说一句,正如我之前所说的,您可以在GitHub存储库中填写一个问题,我们可以讨论如何实现这个需求

从我的观点来看,很容易告诉TrraceRe狗狗,你想考虑一个属性在属性类型是一个值类型时设置的任何时候都发生了变化。实现此功能并不难。

Disclamer:我是我将向您推荐的库的作者


由于其他一些要求,我必须开发一个库来跟踪任何对象的更改,所以我实现了这个库,这是一个很好的例子

如果要跟踪更改,只需执行以下步骤即可:

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;
var config=ObjectChangeTracking.CreateConfiguration();
config.TrackThisType();
var trackableObjectFactory=config.CreateTrackableObjectFactory();
var model=新的YourModelClass();
var trackableModel=config.CreateFrom(model);
//现在对整个可跟踪模型执行更改:
trackableModel.Text=“hello world”;
//然后,您可以随时获取已更改的属性
//使用扩展方法获取与关联的更改跟踪器
//你的模型
var changeTracker=trackableModel.GetChangeTracker();
var changedProperties=changeTracker.changedProperties;
//甚至是不变的:
var unhangedProperties=changeTracker.UnchangedProperties;
我相信您应该能够满足您的更改跟踪需求,如果您觉得您需要一些新功能或增强现有功能,请随时填写问题,我们可以在那里讨论

您还可以一步一步地解释所有可用功能

关于区分值类型的默认值 TrackerDog将能够告诉您,如果某个属性的值与在构造期间使用构造函数或初始值设定项设置的值不同,则该属性是否已更改。例如,如果一个属性是
int
,并且它被设置为
0
,则上一个值和新值将相等,因此,它根本没有更改。顺便说一句,正如我之前所说的,您可以在GitHub存储库中填写一个问题,我们可以讨论如何实现这个需求


从我的观点来看,很容易告诉TrraceRe狗狗,你想考虑一个属性在属性类型是一个值类型时设置的任何时候都发生了变化。实现此功能并不难。

为什么反对使用可空类型?考虑到您的困境,这无疑是一条出路。
default(int)
返回
int
类型的默认值;对于任何其他类型都相同。它返回
null