Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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#_.net_Properties - Fatal编程技术网

C# 为每个属性添加布尔值

C# 为每个属性添加布尔值,c#,.net,properties,C#,.net,Properties,我正在构建一个c#类,它可以处理两个不同的数据源。它将加载数据源并从函数中获取配置集。然后我想对对象中的所有属性执行几个任务 比如说 public String StreetAddress { get { return _streetAddress; } set { if (value.Length <= 64) _streetAddress = value;

我正在构建一个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();
        }
    }
公共字符串StreetAddress
{
获取{return\u streetAddress;}
设置
{

如果(value.Length如果您希望采用面向对象的方式进行操作,您可以:

定义用于保存属性的接口和类,例如:

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; }
    }
}
以后查找更改的属性只需查看
\u属性值
,并查找其中哪些是
IsDirty


这种方法还提供了一种以面向对象的方式向属性添加更多功能的方法(例如引发PropertyChanged/PropertyChanged事件,将其映射到DB字段等)。

在这种情况下,我更喜欢Dto实现之外的方法

实现一个单元,该单元将获取一个类的两个实例,并确定所有差异

映射要比较的每个属性:

static PropertyManager<Dto> manager = new PropertyManager<Dto>()
    .Map(x => x.City)
    .Map(x => x.StreetAddress);
此示例代码打印出:

Instances differ
x.City
下面是一个完整的代码示例:

如果你想存储一个人移动过的状态列表,那么为什么不将其存储为
公共列表状态
?那么你真正想知道的是在保存之前哪些属性发生了更改,对吗?我知道必须有一种方法来做到这一点!太棒了!我现在不在开发人员的计算机上玩这个,但我想我不会不必为每个属性创建一个变量。如果我在中发送一个名称,它将通过泛型类型跟踪属性?我刚刚意识到…如果我有一个类型为list的变量,该怎么办?在这种情况下,您可以定义ListPropertySlot和匹配的接口。该接口应派生自IPropertySlot和泛型IList类将通过将列表成员重定向到列表的内部实例来实现它。在每次修改调用(添加、删除等)时,它都会更新IsDirty标志。_属性如下?Dictionary _属性=new Dictionary();不。
新词典
。这肯定是一种方法,但我会接受下面的答案,因为这样会减少工作量。
    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