C# 如何在其他类中使用非静态方法而不在C中创建对象

C# 如何在其他类中使用非静态方法而不在C中创建对象,c#,class,methods,C#,Class,Methods,我最近对我的项目做了一点修改,加入了一个接口,以实现更好的集成。我一直在研究如何在一个表单上访问一个方法,该方法用于从继承自接口的类中更新表单控件。下面是一些代码片段,这些代码应该有助于提高清晰度 //this is the double click event from where i have to call SelectDeal method private void TodayEventsGridView_DoubleClick(object sender, EventArgs

我最近对我的项目做了一点修改,加入了一个接口,以实现更好的集成。我一直在研究如何在一个表单上访问一个方法,该方法用于从继承自接口的类中更新表单控件。下面是一些代码片段,这些代码应该有助于提高清晰度

 //this is the double click event from where i have to call SelectDeal method

   private void TodayEventsGridView_DoubleClick(object sender, EventArgs e)

    {
        DealModule _dealModule = new DealModule();

        // i dont want to create an obect of class DealModule()
        try
        {
            this.Cursor = Cursors.WaitCursor;
            _dealModule.SelectDeal(DealKey);

        }
        catch (Exception ex)
        {
            MessageBox.Show("Warning: " + this.ToString() + " " + System.Reflection.MethodInfo.GetCurrentMethod().Name + "\n" + ex.Message, ex.GetType().ToString());
        }
        finally
        {
            this.Cursor = Cursors.Default;
        }
    }
如果要在没有DealModule实例的情况下访问SelectDeal,则需要将SelectDeal标记为静态

例如:

如果一个方法没有标记为static,那么没有实例就无法访问它。 但是,由于接口中不能使用静态方法,因此您可能希望使用Singleton解决此问题:

public class DealModule
{
    private static DealModule instance = null;
    public static DealModule Instance
    {
        get
        {
            if (instance == null)
                instance = new DealModule();
            return instance;
        }
    }
    // other code

    public void SelectDeal(Key dealKey) ( /* ... */ }
}
然后

DealModule.Instance.SelectDeal(DealKey);

根据定义,这是不可能的。实例非静态方法只能在您有类的实例要处理时使用。您要么需要使用类的实例,要么将方法声明为静态

正如Patrick在下面所说的,您尝试这样做的事实可能表明存在设计缺陷,但是如果没有更多的上下文,很难建议如何改进它


我要补充的是,在一般情况下,从设计的角度来看,最好是针对类的实例或更好的接口调用,而不是静态方法。这增加了可测试性,并帮助您实现松耦合,使您的软件更易于维护。为什么您认为在您的情况下调用静态方法更可取?

您不这么认为。不可能。您能详细说明一下为什么不想创建DealModule类吗?如果我们更多地了解您的约束条件,也许我们可以建议一个更好的解决方案。从技术上讲,您仍然在创建一个实例。@帕特里克霍夫曼:是的,仍然是一个实例,但每次都只有一个,而不是一个新实例……迈克,我无法创建DealModule类的实例,因为其他类正在使用DealModule的方法,DealModule包含一些值,如果我要创建一个实例,那么所有的值都将被洗掉,这是我在其他用途中需要的
DealModule.Instance.SelectDeal(DealKey);