【问题标题】:Call Methods from another class c#从另一个类 c# 调用方法
【发布时间】:2020-10-20 12:46:58
【问题描述】:

我在调用另一个类中的方法时遇到了一个简单的问题。
我在不同的类文件中有很多类似的代码,我认为我可以使用我经常使用的方法创建一个全局类。
但我不知道如何正确地做到这一点。
请检查我下面的代码并告诉我它可能出了什么问题。
另外,请告诉我是否可以做不同的事情?
Form1 只包含一个按钮。

namespace GlobalMethod
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public void ChangeTextInButton1(string newText)
    {
        button1.Text = newText;
    }
    private void Button1_Click(object sender, EventArgs e)
    {
        GlobalMethods gm = new GlobalMethods();
        gm.ChangeTextButtonFromOtherClass();
    }
}

public class GlobalMethods
{
    public void ChangeTextButtonFromOtherClass()
    {
        Form1 f1 = new Form1();
        f1.ChangeTextInButton1("NEW BUTTON NAME");
    }
}

}

当我调用这些方法时,方法完美,string 被传递给ChangeTextInButton1(),但button 中的Text 没有改变,我不知道为什么。

【问题讨论】:

  • 该代码中没有“全局”。您正在ChangeTextButtonFromOtherClass 中创建一个new Form1,与任何现有表单无关
  • 您应该提供对现有表单的引用,而不是创建一个表单,以便对其进行修改。

标签: c# function class object methods


【解决方案1】:

您正在 GlobalMethods 中创建 From1 的新实例。

因此,如果您期望从中调用 globalmethods 的 Form1 的现有实例会发生变化,那么这是不正确的。

如果您想像这样“共享”代码,那么静态方法是一种方法。所以你也不需要每次都新建一个 GlobalMethods 实例,然后传入你要更新的 Form1 实例即可。

public static class GlobalMethods
{
    public static void ChangeTextButtonFromOtherClass(Form1 f1)
    {
        f1.ChangeTextInButton1("NEW BUTTON NAME");
    }
}

(我假设这个类中没有其他方法,并且您不需要为其他目的启动它的实例)

话虽如此。如果真的只有 1 行代码,就这么简单,那么虽然你在技术上打破了“不要重复自己”的规则,但不值得有一个新的类来做这件事。只需重复同一行代码即可。

话虽如此!

如果您有多个执行相同操作的表单。然后你应该创建一个新的表单类来实现这个功能,然后你的所有表单都可以从那个新的父表单继承。

【讨论】:

    【解决方案2】:

    您应该提供对现有表单的引用,以便修改它,而不是创建一个表单。为此,将依赖注入GlobalMethods的构造函数:

    class GlobalMethods
    {
        private readonly Form1 form;
        public GlobalMethods(Form1 f) { this.form = f; }
    }
    

    现在您可以在 ChangeTextButtonFromOtherClass-method 中引用该表单:

    public void ChangeTextButtonFromOtherClass()
    {
        this.form.ChangeTextInButton1("NEW BUTTON NAME");
    }
    

    最后,您需要在 click-eventhandler 中提供该引用:

    private void Button1_Click(object sender, EventArgs e)
    {
        GlobalMethods gm = new GlobalMethods(this);
        gm.ChangeTextButtonFromOtherClass();
    }
    

    除了将引用传递给GloablMethods 的构造函数之外,您还可以将其提供给ChangeTextButtonFromOtherClass 方法本身。

    【讨论】:

      猜你喜欢
      • 2014-01-31
      • 1970-01-01
      • 2013-05-17
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多