C#跨类保留变量

时间:2012-06-15 12:46:33

标签: c# events scope method-call

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

我遇到的问题是调用广播是在frmDatasheet,都到了datasheetPlugin以提高广播请求,而且我越来越空,因为我要离开这个插件,然后回来给它的一切在那来回徘徊。这是我的代码:

//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

位于frmDataSheet.cs的顶部

private DatasheetPlugIn frmState = new DatasheetPlugIn();

这可能是问题吗?获得新的数据表插件......清除它,但我怎么能得到.Broadcast?

这是我在DatasheetPlugin.cs中的代码

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

我没有收到错误,但信号器显示事件(BroadcastState,ProjectOpened,ProjectSaved),但它们都具有空值。然后它进入信号器,检查BroadcastState是否有任何用户,因为signaller为空而失败。

如何确保从frmDatasheet返回插件时,一切仍然完好无损?如果我在插件中本地调用.Broadcast对某些click事件,则signaller不为null。所以,我很确定它是由于来回而不是保留信息。

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

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);
}

感谢您的任何见解!!

2 个答案:

答案 0 :(得分:0)

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

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

“signaller”对象在您实例化之前将为null,在调用OnImportsSatisfied()时会出现这种情况。所以当你说你在打电话时......

private DatasheetPlugIn frmState = new DatasheetPlugIn();

...在文件的顶部,如果你从不调用“OnImportsSatisfied()”,信号器将为空。

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

答案 1 :(得分:0)

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

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

然后,packedState将填充数据表的当前状态,以便发送到同一DSPlugin中的Broadcast(),因此我不会丢失任何在两个类之间来回传输的内容。我从frmDSheet中的GoToModeling click方法中取出了我需要的东西,然后将它移到了PackState,这样我就可以在广播之前抓住它。