在 C# 中,当我将该对象用作参数时,如何在该对象上执行该方法?

In C# how can I execute a method on an object when I am using that object as a parameter?

这是在使用 .net Framework v4.8 的 asp.net webforms 应用程序上

(我知道这是旧技术,我不应该在其中编写新项目。我已经十多年没有在 asp.net 中编写任何东西了,当我用这种方式编写代码时,webforms 是要使用的东西。我将学习 Blazor 并在将来在更现代的平台上重新编码。抱歉,我只是想避免评论中的任何“你为什么使用 webforms”。)

我在页面上有一个如下所示的参数:

        public Dictionary<string, string> StrategySubtypes {
        get
        {
            return (ViewState["StrategySubtypes"] == null) ? new Dictionary<string, string>() : (Dictionary<string, string>)ViewState["StrategySubtypes"];
        }
        set
        {
            ViewState["StrategySubtypes"] = value;
        }
    }

当我使用下面的代码调用字典的 add 方法时,代码没有 return 错误,但它也没有将新的字典项写入 ViewState。

        protected void btnAddSubtype_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> tmpStrategySubtypes = StrategySubtypes;
        StrategySubtypes.Add(txtSubtype.Text, "new");
        lbSubtypes.DataSource = StrategySubtypes;
        lbSubtypes.DataTextField = "Key";
        lbSubtypes.DataValueField = "Value";
        lbSubtypes.DataBind();
        txtSubtype.Text = String.Empty;
    }

它只是进入了以太。我相信发生的事情是,当我调用 Add 方法时,我从 get 访问器获取 Dictionary 并且我正在该字典上执行 add 方法,但是 Add 不调用 set 访问器所以我只是数据绑定反对同一个原始词典。

我正在使用以下代码解决这个问题

        protected void btnAddSubtype_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> tmpStrategySubtypes = StrategySubtypes;
        tmpStrategySubtypes.Add(txtSubtype.Text, "new");
        StrategySubtypes = tmpStrategySubtypes;
        tmpStrategySubtypes.GetEnumerator().Dispose();
        lbSubtypes.DataSource = StrategySubtypes;
        lbSubtypes.DataTextField = "Key";
        lbSubtypes.DataValueField = "Value";
        lbSubtypes.DataBind();
        txtSubtype.Text = String.Empty;
    }

但这看起来不够优雅,而且笨拙。 一定有更好、更正确的方法来实现这一点。我的问题是,如果我使用对象作为 public 参数,有没有办法直接在该参数上调用方法并让它使用 set 访问器存储结果?

在 get 访问器中,如果为 null,当前代码会创建一个新字典,但它从不使用这个新字典实例设置 ViewState。因此,当您再次询问 StrategySubtypes 属性 的值时,null 仍然存在并返回一个新字典。
轻松修复:

public Dictionary<string, string> StrategySubtypes {
get
{
    var dict = ViewState["StrategySubtypes"] as Dictionary<string, string>;
    if(dict == null)
    {
       dict = new Dictionary<string, string>();
       ViewState["StrategySubtypes"] = dict;
    }
    return dict;
}
set
{
    ViewState["StrategySubtypes"] = value;
}