跨类保留变量的 C#

本文关键字:变量 保留 | 更新日期: 2023-09-27 18:37:14

我正在开发一个插件应用程序。我有一个frmDatasheet.cs(后端),它是DatasheetPlugin.cs(前端)。我正在处理此数据表和模型插件之间的广播事件,因此,如果有人返回数据表,进行一些更改,然后返回到建模,建模将知道新状态并自行更新。

我遇到的问题是对广播的调用在 frmDatasheet 中,它转到数据表插件以提出广播请求,我得到空值,因为我离开插件然后回到它,一切都在来回丢失。这是我的代码:

//in the frmDatasheet.cs, click GoToModeling, this is last few lines
IDictionary<string, object> packedState = new Dictionary<string, object>();
packedState = PackState(); <----packs up state to send
frmState.Broadcast(packedState); <----- had to instantiate new Plugin to get at .Broadcast

在 frm数据表的顶部.cs

private DatasheetPlugIn frmState = new DatasheetPlugIn();

这可能是问题所在吗?? 获取新的数据表插件..这是否清除了它,但是我还能如何获得.广播?

这是我在数据表插件中的代码.cs

 public void Broadcast(IDictionary<string,object> packedState)
 {
     signaller.RaiseBroadcastRequest(packedState);            
 }

我没有收到错误,但信号器显示事件(广播状态、项目打开、项目保存),但它们都具有空值。然后它转到信号器,检查 BroadcastState 是否有任何订阅者,失败,因为信号器为空。

如何确保当我从 frmDatasheet 返回插件时,所有内容仍然完好无损?如果我把电话接到.在插件本地广播某些点击事件,信令不为空。所以,我很确定这是由于来回而不是保留信息。

更新:我可能应该包含与信号器相关的代码。每个插件都有:

private VBTools.Signaller signaller;  //declared at top of plugin
//This function imports the signaller from the VBProjectManager
//Happens when app loads for each plugin.
[System.ComponentModel.Composition.Import("Signalling.GetSignaller", AllowDefault = true)]
public Func<VBTools.Signaller> GetSignaller
{
    get;
    set;
}
public void OnImportsSatisfied()
{
//If we've successfully imported a Signaller, then connect its events to our handlers.
signaller = GetSignaller();
signaller.BroadcastState += new VBTools.Signaller.BroadCastEventHandler<VBTools.BroadCastEventArgs>(BroadcastStateListener);
signaller.ProjectSaved += new VBTools.Signaller.SerializationEventHandler<VBTools.SerializationEventArgs>(ProjectSavedListener);
signaller.ProjectOpened += new VBTools.Signaller.SerializationEventHandler<VBTools.SerializationEventArgs>(ProjectOpenedListener);
this.MessageSent += new MessageHandler<VBTools.MessageArgs>(signaller.HandleMessage);
}

感谢您的任何见解!!

跨类保留变量的 C#

当您实例化具有以下行的新 DatasheetPlugin 类时:

private VBTools.Signaller signaller;  //declared at top of plugin

"signaller"对象将为空,直到您实例化它,这似乎是您在调用OnImportsSatisfied()时这样做的。所以当你说你在打电话时...

private DatasheetPlugIn frmState = new DatasheetPlugIn();

。在文件顶部,如果您从未调用"OnImportsSatisfied()",则信号器将为空。

可能是您在类成员变量和静态变量之间混淆了。 http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

为了解决这个问题,我将GoToModeling点击事件放在DSPlugin中(在frmDSheet中)。

void btnGoToModeling_Click(object sender, EventArgs e)
{
    IDictionary<string, object> packedState = new Dictionary<string, object>();
    packedState = _frmDatasheet.PackState();
    Broadcast(packedState);
}

然后,packedState 填充了要发送到 Broadcast() 的数据表的当前状态,该数据表位于同一个 DSPlugin 中,因此我不会丢失在 2 个类之间来回传输的任何内容。我从 frmDSheet 中的 GoToModeling 点击方法中获取了我需要的东西,并将其移动到 PackState,这样我也可以在广播之前获取它。