我正在构建一个使用两个不同数据源的c#类。它将加载数据源并从函数中获取配置集。然后我想对对象中的所有属性执行几个任务。
例如。
public String StreetAddress
{
get { return _streetAddress; }
set
{
if (value.Length <= 64)
_streetAddress = value;
else
_streetAddress = value.Substring(0, 1024).Trim();
}
}
public String City
{
get { return _city; }
set
{
if (value.Length <= 128)
_city = value;
else
_city = value.Substring(0, 128).Trim();
}
}
public String State
{
get { return _state; }
set
{
if (value.Length <= 128)
_state = value;
else
_state = value.Substring(0, 128).Trim();
}
}
这样可以保留一方的数据。我希望能够在每个房产上存储和设置更改标志。所以,如果我们以国家为例。如果此人从德克萨斯州搬到伊利诺伊州,我想在该属性中设置一个bool来记录更改,然后在将对象保存到数据库之前能够循环所有更改。但我没有看到任何方法在该属性中分配另一个状态变量。最好的方法是在此基础上编写另一个对象来控制它,还是有另一种更有创意的方法来在一个属性中存储多个字符串?
答案 0 :(得分:1)
如果你喜欢OOP的做法,你可以:
定义用于保存属性的接口和类,例如:
interface IPropertySlot
{
bool IsDirty { get; }
void ResetIsDirty();
object UntypedValue { get; }
}
class PropertySlot<T>:IPropertySlot
{
public T Value { get; private set; }
public bool SetValue(T value)
{
if (!Equals(_value, Value))
{
Value = value;
IsDirty = true;
return true;
}
return false;
}
public bool IsDirty { get; private set; }
public void ResetIsDirty()
{
IsDirty = false;
}
public object UntypedValue
{
get { return Value; }
}
}
将您的属性存储在类中,从String
(对于属性名称)到IPropertySlot
的字典中,并通过一对方法获取/设置它们:
void SetProperty<T>(string name, T value)
{
IPropertySlot property;
if (!_properties.TryGetValue(name, out property))
{
property = new PropertySlot<T>();
_properties[name] = property;
}
((PropertySlot<T>)property) .SetValue(value);
}
T GetProperty<T>(string name)
{
IPropertySlot property;
if (!_properties.TryGetValue(name, out property))
{
property = new PropertySlot<T>();
_properties[name] = property;
}
return ((PropertySlot<T>)property).Value;
}
稍后查找更改后的属性只需要检查_properties.Values
并查找哪些属于IsDirty
。
此方法还为您提供了一种以OO方式向属性添加更多功能的方法(例如,引发PropertyChanged / PropertyChanging事件,将其映射到数据库字段等)。
答案 1 :(得分:0)
在这种情况下,我更喜欢Dto实现的外部方法。
实现一个可以接受一个类的两个实例的单元,并确定所有的差异。
映射每个属性进行比较:
static PropertyManager<Dto> manager = new PropertyManager<Dto>()
.Map(x => x.City)
.Map(x => x.StreetAddress);
使用两个实例来计算差异:
var a = new Dto{ StreetAddress = "Foo", City = "Bar" };
var b = new Dto{ StreetAddress = "Foo", City = "Baz" };
var differences = manager.ComputeDifferences(a,b).ToList();
if( differences.Any() )
{
Console.WriteLine("Instances differ");
}
foreach (var diff in differences)
{
Console.WriteLine(diff);
}
此示例代码打印出来:
Instances differ
x.City
这是一个完整的代码示例: https://dotnetfiddle.net/4sNeoN