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

Posted

技术标签:

【中文标题】在 C# 中,当我使用该对象作为参数时,如何对该对象执行方法?【英文标题】:In C# how can I execute a method on an object when I am using that object as a parameter? 【发布时间】:2022-01-05 05:19:26 【问题描述】:

这是一个使用 .net Framework v4.8 的 asp.net webforms 应用程序

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

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

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

当我使用下面的代码在字典上调用 add 方法时,代码不会返回错误,但它也不会将新的字典项写入 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;
    

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

【问题讨论】:

【参考方案1】:

在 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;

【讨论】:

非常感谢!我真的觉得自己很傻。我没有更仔细地查看我的代码在做什么,而是直接得出了这样一个结论,即我无法在公共属性上执行方法。

以上是关于在 C# 中,当我使用该对象作为参数时,如何对该对象执行方法?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试将 Get API 中的 json 对象作为 C# ASP.Net 中的查询字符串参数传递时,Swagger 给出错误

如何:创建用于绘制的 Graphics 对象

C#中的枚举类型如何传递参数呢?

如何使用 C# 中的反射调用将输入参数作为另一个类对象的方法?(方法给出参数异常)

C#中的构造函数

如何在将对象作为泛型参数传递时使用它的基础类型