c# - 我如何知道我的列表中的项目是否已更改?
问题描述
我目前正在尝试构建自己的小型 OR-Mapper。和 EF 一样,我有一个上下文和一个集合类。例如:
public class As400Context : IDisposable
{
public As400Set<MyClass> MyList{ get; set; }
}
目前,MyClass 中正在跟踪更改。
public class MyClass
{
private HashSet<string> ChangedProperties = new HashSet<string>();
private Dictionary<string, object> OriginalValues = new
Dictionary<string, object>();
private readonly ChangeState State = new ChangeState();
public List<string> GetChangedProperties()
{
return ChangedProperties.ToList();
}
private void Setter(string field, object value)
{
OriginalValues.TryGetValue(field, out object originalValue);
if (originalValue == null)
{
OriginalValues.Add(field, GetType().GetField('_' + field,
BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this));
}
if (value.ToString() != originalValue.ToString())
{
ChangedProperties.Add(field);
}
else
{
ChangedProperties.Remove(field);
OriginalValues.Remove(field);
}
}
private string _Item;
public string Item
{
get { return _Item; }
set
{
Setter(nameof(Item), value);
_Item = value;
}
}
}
T 是我的班级
public class As400Set<T> : List<T>
{
public new void Add(T obj)
{
if (obj != null)
{
var state = obj.GetType().GetField("State",
BindingFlags.NonPublic | BindingFlags.Instance);
var stateValue = (ChangeState)state.GetValue(obj);
if (stateValue != ChangeState.Modified)
state.SetValue(obj, ChangeState.Added);
base.Add(obj);
}
}
public new void Remove(T obj)
{
if (obj != null)
{
obj.GetType().GetField("State", BindingFlags.NonPublic |
BindingFlags.Instance).SetValue(obj, ChangeState.Removed);
}
}
}
我不认为这是最好的方法。我想在上下文级别上有一个更改跟踪器。添加和删除没有问题,但是我该如何处理修改后的列表项呢?
例如:
var context = new As400Context();
var myList = context.MyList.FirstOrDefault();
myList.Item= "Test";
抱歉英语不好,我希望你明白我想要达到的目标:)
编辑:我还需要知道哪个属性发生了变化。
解决方案
推荐阅读
- php - 难以在 wordpress single.php 中显示动态侧边栏
- apache - 仅在顶层目录中使用 mode_rewrite 剥离 .html
- reactjs - 如何从编译错误中忽略文件夹?
- php - WooCommerce 自定义运输方式出现在错误的位置
- r - 根据 R 中的单个行值对列进行排序
- c# - 将 MLMultiArray (swift) 隐蔽到 C# (Xamarin)
- python - 海龟图形暂停/恢复功能上的随机游走
- javascript - AR.JS Web 桌面性能低帧率
- java - org.hibernate.spatial.dialect.postgis.PostgisDialect 支持 PostgreSQL 12.5
- mantis - 字符串自定义字段可以显示以前输入的值吗?