【问题标题】:Calling different methods depending on enum value without using switch在不使用 switch 的情况下根据枚举值调用不同的方法
【发布时间】:2011-02-23 09:41:42
【问题描述】:

我有以下代码:

public void ParseNetworkPacket(IAsyncResult iResult)
    {
        NetworkConnection networkConnection = (NetworkConnection)iResult.AsyncState;

        string teste = NetworkPacketType.ToString();

        switch (this.NetworkPacketType)
        {
            case NetworkPacketType.ShotPacket:
                break;
            case NetworkPacketType.ShotResponsePacket:
                break;
            case NetworkPacketType.ChatMessagePacket:
                break;
            default:
                break;
        }

        networkConnection.BeginReadPacket();
    }

NetworkPacketType 是我定义的枚举。 在开关中,根据枚举的类型,我会调用不同的方法。 我想不使用 switch 来做到这一点,因为我可能有太多的枚举类型。 有没有其他方法可以做到这一点?或者使用枚举是唯一可能的方式?

【问题讨论】:

  • Switch 语句最适合有很多条件的情况。在你的例子中有多少是“太多”?
  • 我还不确定,但可能很多......我只是想以更“通用”的方式来做。
  • 带有虚方法的类层次结构怎么样?

标签: c# .net


【解决方案1】:

除了使用 Veer 链接的答案中建议的地图外,您还可以使用反射。例如,如果您将方法命名为枚举值,则可以这样做:

public void ParseNetworkPacket(IAsyncResult iResult)
    {
        NetworkConnection networkConnection = (NetworkConnection)iResult.AsyncState;

        string teste = NetworkPacketType.ToString();

        string methodName = this.NetworkPacketType.ToString();

        MethodInfo methodInfo = GetType().GetMethod(methodName, 
            BindingFlags.Instance | BindingFlags.NonPublic);

        methodInfo.Invoke(this, /* your arguments here */);

        networkConnection.BeginReadPacket();
    }

private void ShotPacket() 
{
    ....
}

但如果不是绝对必要的话,我不会真的推荐这种方法。除其他外,维护它可能会很痛苦。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多