C# 如何从没有参数的函数中获取对调用窗体的引用

C# 如何从没有参数的函数中获取对调用窗体的引用,c#,vb.net,dll,C#,Vb.net,Dll,我有两个项目。一个是GUI,第二个是DLL 我从Form1调用DLL中的函数 DLL函数必须与表单接口(例如,更改背景颜色) 我希望将调用表单作为引用,而不作为参数传递 下面是表格1中的示例 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ChangeBackColor() End Sub DLL函数 Public Sub ChangeBackColor()

我有两个项目。一个是GUI,第二个是DLL

我从Form1调用DLL中的函数

DLL函数必须与表单接口(例如,更改背景颜色)

我希望将调用表单作为引用,而不作为参数传递

下面是表格1中的示例

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ChangeBackColor()
End Sub
DLL函数

Public Sub ChangeBackColor()
  Dim CallingForm as Form
  '''GET PARENT HERE'''
  CallingForm.BackColor = Color.Cyan
End Sub
显然,如果我每次都通过表格,我可以做到这一点,但要尽量避免。 提前感谢

有人指出这个问题已经在别处得到了回答。据我所知,还没有人回答(或询问)。这特定于引用表单,而不是方法或其他对象


通过引用form.ActiveForm,我得到了引用调用表单的解决方案,现在我要回答下面我自己的问题。

从设计角度来看,这确实是一件不好的事情

以这种方式设计应用程序存在许多严重问题:

  • 您依赖的是环境上下文之类的东西,如果使用不当,这是一种反模式。这是一个典型的错误使用案例,因为:
  • 您隐藏了
    ChangeBackColor
    函数依赖于调用该方法的表单的事实!!如果其他代码块正在调用此代码怎么办?代码将失败
最后一点尤其是一个问题,因为这使得对这段代码进行单元测试非常困难,并且容易出错。方法签名都是关于传达函数的意图,因此还需要告诉执行工作需要哪些东西(对象、值、服务等)

因此,如果函数中需要表单或任何对象,请在签名中显示

如果您不喜欢在每次调用中都需要添加此项,可以通过将代码创建为扩展方法来美化代码:

Public Module FormExtensions
   <Extension>
   Public Sub ChangeBackColor(form as Form, newBackColor as Color)
        form.Backcolor = newBackColor
   End Sub
End Module

我最终通过使用调用活动窗体

Form.ActiveForm
以下功能现在可以工作(与其他功能一起)

Public Sub ChangeBackColor()
暗淡的呼唤形式
''在这里找家长''
CallingForm=Form.ActiveForm
CallingForm.BackColor=Color.Cyan
端接头

感谢所有试图帮助您的人

为什么您需要从表单调用DLL方法来更改表单的背景色?简短回答:否。长回答:可能重复@puropoix这只是一个示例。真正的代码要大得多,与颜色无关,但参考原则是相同的,但如果你必须知道的话。。DLL会截取调用它的应用程序的屏幕截图。我需要得到的形式,找到它的大小和位置,使截图不是全屏。这个dll将用于其他应用程序,因此它与应用程序是分开的。背景色只是一个例子,用来说明我想要实现的目标,而不是实际问题。我确实需要它来获取调用表单的位置和大小,并在DLL中将其设置为新表单的父级。此外,我不关心这种情况下的良好实践,我只需要这项工作本质上,我希望有一个像FOO()这样的函数,然后它引用父级的公共属性(大小、位置、本身)。这样我就可以在调用窗体的同一屏幕上覆盖DLL窗体
Me.ChangeBackColor(Color.Red)