Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找类的已更改属性_C# - Fatal编程技术网

C# 查找类的已更改属性

C# 查找类的已更改属性,c#,C#,我正在使用asp.NET3.5 我有一个包含10个属性且未标记为可序列化的许可证类。我必须将属性更改记录到数据库中。许可证是一个实体类,修改它不在我的范围之内。所以我不能将其标记为Serializa贝尔,也不能使用IpropertyChanged接口 现在我无法将其存储在viewstate中,因为它不可序列化。我想将其存储起来,以便将其与新值进行比较,并查看哪个值发生了更改 如何进行此操作。您可以编写一个类,该类查看目标对象,并使用反射将其所有公开属性的值存储在名称/值字典中。然后,在“比较”时

我正在使用asp.NET3.5

我有一个包含10个属性且未标记为可序列化的许可证类。我必须将属性更改记录到数据库中。许可证是一个实体类,修改它不在我的范围之内。所以我不能将其标记为Serializa贝尔,也不能使用IpropertyChanged接口

现在我无法将其存储在viewstate中,因为它不可序列化。我想将其存储起来,以便将其与新值进行比较,并查看哪个值发生了更改


如何进行此操作。

您可以编写一个类,该类查看目标对象,并使用反射将其所有公开属性的值存储在名称/值字典中。然后,在“比较”时,再次使用反射并与字典中存储的值进行比较


只是猜测一下…

如果您拥有原始对象(即更改前)。然后最好使用反射来循环暴露的属性并比较它们

您的代码可能会最终看起来像这样(这不是完整的示例):


然后,您可以存储不同的列,或者使用不同的列执行任何操作。

作为给定答案的替代方案,您可以查看面向方面的编程(例如PostSharp:)


通过这种方式,您可以在类之外创建一个方法,该方法在每次设置属性时都会被调用。差异之后,可以将任何更改插入数据库

是否使用LINQ2SQL?如果是这样的话,它有一些方法来处理这个问题。不,我们没有使用LINQ2SQL。我们正在使用企业库并在DAL中填充我们的实体。
Type type = license.GetType();
PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach(PropertyInfo property in properties)
{
//compare your properties with property.GetValue(newLicense, null) and property.GetValue(originalLicense, null);
}