控件类型和代码的类或枚举结构
本文关键字:枚举 结构 类型 代码 控件 | 更新日期: 2023-09-27 18:17:48
我想为我的套接字通信的对等体实现一个具有控制代码的类。我尝试了枚举和派生类,但我的尝试不起作用。
我想要一个包含不同Codes
的Type
。例如,控制作为类型,唤醒和关机作为代码信息。
对等端应该能够使用Switch Case来识别信息。比如:
switch(data.Type)
{
case Control:
/* Check diffrent codes */
break;
case Notification:
/* Check diffrent codes */
break;
}
我尝试了以下,但遗憾的是,我不能使用Switch Case或类似的来识别信息。
public abstract class Type
{
private readonly String _code;
protected Type(String code)
{
_code = code;
}
public String Code
{
get { return _code; }
}
}
public sealed class Control : Type
{
public static readonly Control Wakeup = new Control("Wakeup");
public static readonly Control Shutdown = new Control("Shutdown");
private Control(String code) : base(code)
{
}
}
有人知道如何实现这一点吗?请注意,TypeXXX不应与CodeYYYY组合。谢谢你的建议!
编辑
我有一个TCP客户端和服务器套接字。一般通信工作正常。现在我想实现一个类或类似的东西,告诉对等体他收到了哪种信息。他能够决定他应该如何处理这些信息。我认为像ICMP控制消息这样的东西会很好。我有一个一般的信息类型和代码指定它。类型代码关系如下所示:
+--------------+-------------+
| Type | Code |
+--------------+-------------+
| Control | Shutdown |
| | Wakeup |
| | CheckUpdate |
| | ForceUpdate |
| ----------- | ----------- |
| Notification | Online |
| | Offline |
| | Login |
| | Logoff |
| ----------- | ----------- |
| Data | Zip |
+--------------+-------------+
包看起来像这样:
+------+------+---------+
| Type | Code | Payload |
+------+------+---------+
接收端检查Type
和Code
后开始处理载荷
创建两个继承自Control类的类:
public class WakeUp : Control
{
}
public class ShutDown : Control
{
}
然后使用此方法创建特定控件的新实例:
public T CreateControl<T>() where T : Control, new()
{
return new T();
}
使用上述方法:
var wakeupControl = CreateControl<WakeUp>();
var shutdownControl = CreateControl<ShutDown>();
更新:
看看策略模式http://www.dofactory.com/Patterns/PatternStrategy.aspx
来自c#语言参考(8.7.2)。Switch (Switch表达式){case…}
如果switch表达式的类型为sbyte、byte、short、ushort、int、uint、long、ulong、char、string或enum类型,则该类型为switch语句的控制类型。否则,必须存在一个用户定义的隐式转换(第6.4节),从switch表达式的类型到以下可能的控制类型之一:sbyte、byte、short、ushort、int、uint、long、ulong、char、string。如果不存在这样的隐式转换,或者存在多个这样的隐式转换,则会发生编译时错误。
我认为你把事情弄得太复杂了。这就是我要做的。
public enum Code { Wakeup, ShutDown, Notification1, Notification2 };
public enum Type { Control, Notification, Invalid }
public static class CodeCheck
{
public static bool IsControl( Code code )
{
return code == Code.Wakeup || code == Code.ShutDown;
}
public static bool IsNotification( Code code )
{
return code == Code.Notification1 || code == Code.Notification2;
}
public static Type GetType( Code code )
{
if ( IsControl( code ) )
return Type.Control;
if ( IsNotification( code ) )
return Type.Notification;
return Type.Invalid;
}
}
用户会这样做:
public void ProcessCode( Code code )
{
switch ( CodeCheck.GetType( code ) )
{
case Type.Control:
// do something
break;
case Type.Notification:
// do something
break;
}
}
这是另一个版本。这是在你的编辑之后,所以它涵盖了所有的组合:
public enum CodeValue { Wakeup, ShutDown, CheckUpdate, ForceUpdate, Online, Offline, Login, Logoff, Zip };
public enum TypeValue { Control, Notification, Data, Invalid }
public class Code
{
public CodeValue CodeValue
{
get;
private set;
}
public TypeValue TypeValue
{
get;
private set;
}
public Code( CodeValue code )
{
CodeValue = code;
DetermineType();
if ( TypeValue == TypeValue.Invalid )
throw new ArgumentException( "code" );
}
private bool IsControl()
{
return CodeValue == CodeValue.Wakeup || CodeValue == CodeValue.ShutDown || CodeValue == CodeValue.CheckUpdate || CodeValue == CodeValue.ForceUpdate;
}
private bool IsNotification()
{
return CodeValue == CodeValue.Online || CodeValue == CodeValue.Offline || CodeValue == CodeValue.Login || CodeValue == CodeValue.Logoff;
}
private bool IsData()
{
return CodeValue == CodeValue.Zip;
}
private void DetermineType()
{
if ( IsControl() )
TypeValue = TypeValue.Control;
if ( IsNotification() )
TypeValue = TypeValue.Notification;
if ( IsData() )
TypeValue = TypeValue.Data;
TypeValue = TypeValue.Invalid;
}
}
用户可以这样使用:
public void ProcessCode( Code code )
{
switch ( code.TypeValue )
{
case TypeValue.Control:
// do something
break;
case TypeValue.Notification:
// do something
break;
}
}