为每个属性添加一个bool

时间:2014-11-11 05:17:18

标签: c# .net properties

我正在构建一个使用两个不同数据源的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来记录更改,然后在将对象保存到数据库之前能够循环所有更改。但我没有看到任何方法在该属性中分配另一个状态变量。最好的方法是在此基础上编写另一个对象来控制它,还是有另一种更有创意的方法来在一个属性中存储多个字符串?

2 个答案:

答案 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