2016-01-06 90 views
0

我在类中有以下代码来设置串口甚至处理程序。请勿嵌套类型警告(C#)

我得到两个警告; CA1034(不要嵌套类型),它告诉我将我的delgate私有化(这将阻止我设置继承类中的偶处理程序)和CA1009(将事件的第二个参数声明为EventArgs或一个扩展EventArgs的类型,名为'e'),我不明白。

我的代码如下

myPort.DataReceived += new SerialDataReceivedEventHandler(port_OnDataRecived); //Setup when port is opened 

private void port_OnDataRecived(object sender, SerialDataReceivedEventArgs e) 
{ 
     int lengthToRead = myPort.BytesToRead; 
     byte[] rxBytes = new byte[lengthToRead]; 
     myPort.Read(rxBytes, 0, lengthToRead); 
     PacketReceived(rxBytes, e); 
} 

public delegate void PacketReceivedEventHandler(object sender, byte[] packet); 
public event PacketReceivedEventHandler OnPacketReceived; 

public virtual void PacketReceived(byte[] packet, EventArgs e) 
{ 
     if (OnPacketReceived != null) 
     { 
      OnPacketReceived(this, packet);     
     } 
} 

我一直在看MSDN文章和一些所谓的问题,但我不能对有关建议的修复回我自己的代码。 This answer排序是有道理的,但我的转换代码看起来像它会导致

OnPacketReceived(this, packet); 

handle(this, new PacketReceivedEventHandler(); 

这需要一个参数(void (object, byte[]) target)(这是我卡住)所取代。至于尝试修复CA1034警告,我甚至没有看到我写的是如何嵌套的类型,而MSDN文章也没有包含如何解决规则违规的示例。

+0

尝试通过删除委托和事件,并使用'EventArgs ',其中'PacketReceivedEventArgs'是一个扩展'System.EventArgs'并包含您需要的信息属性的类 –

回答

5

我甚至不看怎么样我都写在类中的嵌套式

您已经声明了委托类型(PacketReceivedEventHandler)。这是嵌套在另一个类型中的一种类型。只需将声明移到现有类声明之外即可。

对于其他警告,您希望创建一个派生自EventArgsPacketEventArgs类,并将分组数据作为额外属性包含在其中。在那个时候,你可以使用EventHandler<PacketEventArgs>而不是声明自己的委托。

此外:

  • 您当前的检查处理无效被打破,因为它可能被非空到电话之间空变化的方式。
  • 正常情况下,该事件将被称为PacketReceived,您的方法将是OnPacketReceived(和受保护),而不是其他方式。

有了这一切的地方,你必须:

public event EventHandler<PacketEventArgs> PacketReceived; 

protected virtual void OnPacketReceived(byte[] packet) 
{ 
    var handler = PacketReceived; 
    if (handler != null) 
    { 
     handler.Invoke(this, new PacketEventArgs(packet)); 
    } 
} 

或者在C#6,使用空条件操作符来使实现更简单:

public event EventHandler<PacketEventArgs> PacketReceived; 

protected virtual void OnPacketReceived(byte[] packet) 
{ 
    PacketReceived?.Invoke(this, new PacketEventArgs(packet)); 
} 
+0

PacketEventArgs将是实现Even tArgs?这将需要一个字节[]作为参数。 我想解决如何更改SerialDataReceivedEventHandler作为'PacketReceived(rxBytes,e)'不再需要一个SerialDataReceivedEventHandler作为参数。 – MikeS159

+0

@ Mike159:好的,它会来自'EventArgs',是的。从'port_OnDataRecived'你可以调用'OnPacketReceived(txBytes)'。 –

+0

我怎样才能在课堂之外设置课外作业?对于委托,它是'Class.Event + = new Class.Delegate(methodToGoTo);'但委托不再存在。 – MikeS159