C# 在另一个.cs文件类中使用一个.cs文件类中的方法

C# 在另一个.cs文件类中使用一个.cs文件类中的方法,c#,class,C#,Class,我有2个.cs文件,每个文件中都有一个类。如何在Form2.cs内的另一个类中从Form1.cs调用类中的方法 看起来像这样 Form1.cs public partial class Class1 : ClassContainer { public void awesomeMethod() { } } Form2.cs class Class2 : SomethingChanged { public void decentMethod()

我有2个.cs文件,每个文件中都有一个类。如何在Form2.cs内的另一个类中从Form1.cs调用类中的方法

看起来像这样

Form1.cs

public partial class Class1 : ClassContainer
{
    public void awesomeMethod()
        {
        }
}

Form2.cs

class Class2 : SomethingChanged
{
    public void decentMethod()
    {
    }
}
我想在decentMethod()中调用awesomeMethod()。 谢谢。

你是说,像这样

public void decentMethod()
{
    Class1 instance = new Class1();
    instance.awesomeMethod();
}
您需要一个要调用该方法的类的实例


或者,如果您不需要/不想使用实例,请将其设置为静态方法:

public partial class Class1 : ClassContainer
{
    public static void awesomeMethod()
    {
    }
}


我猜这些不是真正的方法签名

awesomeMethod
是否需要引用
decentMethod
的任何成员

如果不是,那么就简单到:

new Class1().awesomeMethod();

为了调用类的实例方法,您需要一个类的实例。因此,要调用Class1的awesome方法,必须创建Class1的实例:

Class1 c = new Class1();
c.awesomeMethod();

不过,从你的开场白来看,这两个实际的类似乎是两种不同的形式。在这种情况下,一个表单创建另一个表单的新实例纯粹是为了获取可能是辅助方法的内容是没有意义的——创建第二个表单可能会带来巨大的开销。您最好将helper方法放在一个单独的、更轻量级的类中。

以下是一些您可以在VisualStudio中尝试的方法。写下你的使用方法而不使用定义。例如,在代码的某个地方键入:

cls\u a实例

然后在cls_a下面有一条弯曲的线。右键单击“cls_a”并从弹出菜单中选择生成。然后看看会发生什么

我看到创建了App_代码目录,类cls_a在该目录中的文件cls_a.cs中生成。Visual Studio生成了该定义。它编译

然后,您可以在不使用cls_a定义的情况下键入方法的用法,如下所示:

instance_a.meth_x()

再次右键单击曲线并选择“生成”。让Visual Studio为您生成定义

我认为ASP.NET要求您将附加类放在App_Code子目录中。如果你需要改变ASP.NET的方式,我认为Web.config文件可以编辑,这样你就可以把代码文件放在任何你想放的地方。我还没有回顾如何做这件事,所以我把它留给你或其他人


无论如何,如果在App_Code子目录中没有您的类和方法,可能会导致您的类和函数在web表单代码中看不到,即使其他所有内容都是正确的。

好的,我是这方面的初学者,对此也很好奇。我相信我理解你的要求。我刚试过这个,几次尝试后,它就点击了,作为一个更新的人,也许我可以用我的话来简化它。我不知道您使用的是哪个程序,但我使用的是Visual Studio 2016。我创建了两个表单(Form1和Form2),每个表单都包含一个按钮。Form1按钮和Form2按钮。当我单击Form1按钮时,它调用form2中的方法;当我单击form2按钮时,它调用Form1中的方法。我注意到,在解决方案资源管理器中,它显示了两种形式,以及它们包含的所有内容。我做了很多研究,如果我错了,请纠正我,但我相信从父容器到子容器的顺序是这样的(名称空间>类>方法)。相信这是真的,我想我需要先调用这个类,然后才能调用这个方法

这些是我的脚本

表格1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }

    private void f1button_Click(object sender, EventArgs e)
    {
        f2Words f2w = new f2Words();
        f2w.Words2();

    }
}
public class f1Words
{
    public void Words1()
    {
        MessageBox.Show("Form 1 Method Calling Worked!");
    }
}

表格2:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void f2button_Click(object sender, EventArgs e)
    {
        f1Words f1w = new f1Words();
        f1w.Words1();

    }
}
public class f2Words
{
    public void Words2()
    {
        MessageBox.Show("Form 2 Method Calling Worked!");
    }
}
在解决方案资源管理器窗口中,它显示Form1和Form2的类。所以我决定尝试调用这些类的新实例

“f1Words f1w=新的f1Words()”和“f2Words f2w=新的f2Words()”

紧接着,我调用了这些类的新实例,并使用它们所包含的方法

“f1w.Words1()”和“f2w.Words2()”

最终的结果是成功的。当我单击Form1的按钮1时,它调用Form2的F2Words类,并从中拉出Words2方法,打开一个消息框,说“Form2方法调用成功!”,Form2按钮2则反之亦然


由于这篇文章已经发表4年了,我想你已经自己发现了这一点,也许找到了更好的解决方案,但对于以后提出同样问题的其他人,我希望这能帮助你解决问题。

假设主要形式是frmMain。在frmMain()的构造函数外进行静态声明;将其分配到同一个构造函数中:

public static frmMain p_frmMain = null;
public frmMain()
{
    InitializeComponent();
    :
    p_frmMain = this;
}
从另一个类(在同一个解决方案中使用main的命名空间)调用main的“btnHelloWorld_Click()”方法:


尝试过,表示不包含接受0个参数的构造函数。我觉得我错过了一些简单的东西,但这是一个艰难的一周。那么,建设者是什么样子的呢?谢谢,我只做静态无效。我正在清理其他人的3k行代码,我遗漏了一些东西-我会接受时间限制到了您的第一段建议您实际处理的两个类是表单-在这种情况下,您尝试调用的方法位于错误的位置。对于由多个表单使用的helper方法在一个特定表单中使用是没有意义的;最好将该方法移动到一个完全独立的助手类。请分享为什么会这样做。您的问题不清楚。只需在Class2中引用Class1。当然,如果Class1实际上是一个表单,那么你不会真的想这样做。
public static frmMain p_frmMain = null;
public frmMain()
{
    InitializeComponent();
    :
    p_frmMain = this;
}
AnotherClass_EventHandler(object sender, EventArgs e)
{
:  // Call frmmain()'s 'btnHelloWorld_Click' event:
   frmMain.p_frmMain.btnHelloWorld_Click (sender, e);
:
}
// Quick, dirty and done.