C#:公共代表:从不同的类别进行调用

问题描述 投票:0回答:1

我在一个单独的类中定义了一个公共委托及其静态成员(返回对象类型),并试图从不同的winforms中调用它。然后,这些winform将检查委托成员返回的类型,然后对其进行适当的转换。到目前为止,一切都很好。但是,Visual Studio抱怨每个Winform中声明的委托类型从未分配给它,其值始终为null。

警告是:

警告CS0649字段'AccountReplenish.transferDelegate'从未分配,并且AccountReplenish.cs中的默认值始终为空ETTA

此外,在AccountReplenish中,如何调用委托类的GetData()?这是我的代码:

namespace ETTA.Classes
{
    public class DelegateClass
    {
        public delegate void TransferObject(object data);
        public TransferObject transferDelegate;
        private static object _receivedOutput = new object();
        public DelegateClass()
        {
            this.transferDelegate += new ETTA.Classes.DelegateClass.TransferObject(ReceiveOutput);
        }
        public static void ReceiveOutput(object data)
        {
            _receivedOutput = data;
        }
        public static object GetData()
        {
            return _receivedOutput;
        }
    }
}

而且我的每个winform都将按以下方式调用它:

public partial class WinForm1: Form
{
    private ETTA.Classes.DelegateClass.TransferObject transferDelegate;
    private object _receivedOutput = new object();

    public WinForm()
    {
        this.transferDelegate += new Classes.DelegateClass.TransferObject(ETTA.Classes.DelegateClass.ReceiveOutput);
    }

    private void button_click(object sender, EventArgs e)
    {
      AutoReplenishWindow _progressWindow = new AutoReplenishWindow(transferDelegate);

      DialogResult dr = _progressWindow.ShowDialog(this);

      if (dr == System.Windows.Forms.DialogResult.OK )
         transferDelegate.GetData(); // is this correct? Intellisense doesn't show GetData() in its list
         if (this._receivedOutput != null && (this._receivedOutput.GetType() == typeof(string)))
             {
                string _s = (string)this._receivedOutput;
                MessageBox.Show("Result: " + _s);
             }
    }
}

public partial class AutoReplenishWindow : Form
    {
        ETTA.Classes.DelegateClass.TransferObject transferDelegate;

        public AutoReplenishWindow()
        {
            InitializeComponent();
        }
        public AutoReplenishWindow(ETTA.Classes.DelegateClass.TransferObject del)
        {
            InitializeComponent();
            transferDelegate = del;
        }


        private async void AutoReplenishWindow_Shown(object sender, EventArgs e)
        {
            int arg1 = 12;
            string _result = await dbUtils.CallFunction(arg1);

            if (_result  != null)
            {                
                transferDelegate.Invoke(_result );                    
                this.Close();
            }
        }
    }

感谢您的帮助。NH

c# delegates public
1个回答
0
投票

您应该以其他方式进行操作。让我们举个例子。我将您的DelegateClass更改为静态Transmitter类,因为它所做的就是将数据从发送方传输到接收方。它有一个公共事件,任何接收者都可以订阅。

public delegate void DataReceivedEventHandler(object data);

public static class Transmitter
{
    public static event DataReceivedEventHandler DataReceived;

    public static void TransmitData(object data)
    {
        DataReceived?.Invoke(data); // Raise the event.
    }
}

现在,让我们创建一个可以显示接收到的数据的接收器表单:

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

        // Subscribe the event
        Transmitter.DataReceived += Transmitter_DataReceived;
    }

    private void Transmitter_DataReceived(object data)
    {
        // Display data.
        textBox1.Text = data.ToString();
    }
}

我们还需要一个发件人。单击按钮时,它将发送在文本框中输入的数据:

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

    private void SendDataButton_Click(object sender, EventArgs e)
    {
        Transmitter.TransmitData(dataTextBox.Text);
    }
}

测试程序会同时打开两个窗口

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var sender = new SendDataForm();
        sender.Show();
        Application.Run(new ReceiveDataForm());
    }
}

当您在发送方表单中输入文本并单击按钮时,文本将自动显示在接收方表单中。

© www.soinside.com 2019 - 2024. All rights reserved.