我想知道是否有一种方法可以为getter或setter设置默认函数。例如,假设我有这样的内容:
public class MyClass
{
public bool IsDirty {get; private set; } = false;
private string _property;
public string Property1
{
get
{
return _property1;
}
set
{
if (value != _property1)
{
_property1 = value;
IsDirty = true;
}
}
}
}
我想知道是否有一种方法可以这样做:
public class MyClass
{
public bool IsDirty {get; private set;} = false;
MyClass.defaultSet = { if (value != !_property1) { _property1 = value; IsDirty = true; } };
private string _property1;
public string Property1 { get; set; }
public string Property2 {get; set;}
public string Property3 {get; set;}
//...
}
这样我就不用用第一种方法了在这个大的类中我有(~100个属性)
您可以使用像这样的辅助方法来减少噪声
private void Set<T>(ref T field, T value)
{
if (!Equals(value, field))
{
field = value;
IsDirty = true;
}
}
那么你可以写:
public string Property1
{
get => _property1;
set => Set(ref _property1, value);
}
不,这是不存在的,原因如下:
- 不是每个属性都是字符串,所以这需要正确处理整数,日期时间,小数等
- 原始值类型已经够糟糕的了,但然后开始抛出像元组这样的东西,复杂的类(其中改变类成员仍然是对属性本身的
get
操作!),委托等 - 如果你引用属性自己的名字,你正在创建一个循环引用,将导致StackOverflowException。
- 不是每个属性都将使用相同的
Property
名称,因此方法的这一部分是不同的。您需要另一个关键字或参数来设置方法。 - 你需要一种方法来免除
someBool
/IsDirty
属性。