外部类更改属性时未访问属性setter
本文关键字:属性 访问 setter 外部 | 更新日期: 2023-09-27 17:58:26
我有一个用于创建dll的公共类。它有一个变量和一个属性。让我们假设它看起来像这样:
public class Main
{
private int _someInt = 0;
public int SomeInt
{
get { return this._someInt; }
set
{
this._someInt = value;
if (this._someInt == 1)
{
_someInt = 0;
}
}
}
public int ExecuteMain()
{
OtherClass.DoSomething(this.SomeInt);
}
}
我还有另一个类,在OtherClass
类的一个单独项目中,它具有静态DoSomething
方法:
public static void DoSomething(int someInt)
{
someInt = 1;
}
我的问题是Main
类中的SomeInt
属性被OtherClass
的DoSomething
方法设置为1,但这不会触发Main
类属性中的setter。我做错什么了吗?
您要做的是将SomeInt按值传递给DoSomething方法,该方法将获得int的副本并更改其本地值。
您可以:
-
传递ref:public static void DoSomething(ref int someInt)
-
传递Main类并更改DoSomething:内的值
公共静态void DoSomething(Mainclass main){main.SomeInt=1}
没有办法做到这一点,即使您使用ref
关键字通过reference传递字段,它也不会起作用,因为您的属性有一个setter方法,而不是您的字段。您应该更改属性的值,以便执行setter方法并执行验证。
您可以这样做,传递类的当前实例而不是字段,例如:
public int ExecuteMain()
{
OtherClass.DoSomething(this); // just pass current instance using 'this'
}
public static void DoSomething(Main obj)
{
obj.SomeInt = 1;
}
如果你想让它调用setter逻辑,一个选项是这样做:
public static void DoSomething(Action<int> setSomeInt)
{
setSomeInt(1);
}
然后这样称呼它:
public int ExecuteMain()
{
OtherClass.DoSomething(x => this.SomeInt = x);
}
这里的概念是,你真正给这个方法的不是一个可以设置的变量,而是一个可以执行的动作。这是一个重要的区别,因为设置属性实际上是一种操作,它可以有任意复杂的实现。不过,这种方法在实践中有点尴尬,所以你需要仔细思考你在这里真正想做什么,以及是否有更好的方式来表达你想要的依赖关系。