外部类更改属性时未访问属性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属性被OtherClassDoSomething方法设置为1,但这不会触发Main类属性中的setter。我做错什么了吗?

外部类更改属性时未访问属性setter

您要做的是将SomeInt按值传递给DoSomething方法,该方法将获得int的副本并更改其本地值。

您可以:

  1. 传递ref:public static void DoSomething(ref int someInt)

  2. 传递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);
}

这里的概念是,你真正给这个方法的不是一个可以设置的变量,而是一个可以执行的动作。这是一个重要的区别,因为设置属性实际上是一种操作,它可以有任意复杂的实现。不过,这种方法在实践中有点尴尬,所以你需要仔细思考你在这里真正想做什么,以及是否有更好的方式来表达你想要的依赖关系。