EventArg类型的Switch-case

时间:2014-11-18 14:32:27

标签: c# .net switch-statement

是否可以在EventArgs周围创建一个switch-case语句?

即:

void MyMethod(object sender, EventArgs e)
{
    switch(e)
    {
        //MyEventArgs inherit from EventArgs
        case e is MyEventArgs:
            //Do some code...
            break;
        default:
            break;
    }
}

现在我找不到将它放在switch-case中的方法,所以我使用if-else语句,当我在其中填充许多if-else时,它会比switch-case慢一些(因为switch-case正在创建某种情况下的案例哈希表。)

5 个答案:

答案 0 :(得分:3)

在开关盒中,必须静态评估每种情况。这意味着在每种情况下都需要一个常量。这篇文章也许有用C# switch statement limitations - why?

答案 1 :(得分:3)

您无法在您的方案中使用switch

switch语句需要一个整数类型或字符串作为参数(下面有更多详细信息)。您不能将EventArgs作为参数传递给switch语句,另外case语句需要编译时常量值。

如果你看C# 5.0 Specifications

  

switch语句的管理类型由交换机建立   表达。

     
      
  • 如果switch表达式的类型是sbyte,byte,short,ushort,int,uint,long,ulong,bool,char,string或enum-type,或者如果它   是可空类型对应于这些类型之一,然后是   是switch语句的管理类型。
  •   
  • 否则,从交换机表达式的类型到下列之一,必须存在一个用户定义的隐式转换(第6.4节)   可能的管理类型:sbyte,byte,short,ushort,int,uint,
      long,ulong,char,string,或者是与一个相对应的可空类型   那些类型。
  •   
  • 否则,如果不存在此类隐式转换,或者存在多个此类隐式转换,则编译时错误   发生。
  •   

代码中的另一个问题是案例陈述:

switch C#

  

每个案例标签都指定一个常量值。

您的case语句指定了在编译时无法确定的值。

这使您可以选择使用if-else块。除非您处理数百种类型EventArgs,否则您不太可能看到任何显着的性能提升。

答案 2 :(得分:1)

您可以使用Dictionary<Type, Action<EventArgs>>

进行尝试
private static Dictionary<Type, Action<EventArgs>> _EventDispatcher;

static Program()
{
    _EventDispatcher = new Dictionary<Type, Action<EventArgs>>();
    _EventDispatcher.Add(typeof(EventArgs), OnEventArgs);
    _EventDispatcher.Add(typeof(MyEventArgs), OnMyEventArgs);
}

private static void MyMethod(object sender, EventArgs e)
{
    Action<EventArgs> eventMethod;

    if (!_EventDispatcher.TryGetValue(e.GetType(), out eventMethod))
        eventMethod = OnUnknownEventArgs;

    eventMethod(e);
}

private static void OnEventArgs(EventArgs e)
{
    Console.WriteLine("Simple event args: " + e);
}

private static void OnMyEventArgs(EventArgs e)
{
    var myEventArgs = (MyEventArgs)e;
    Console.WriteLine("My event args: " + myEventArgs);
}

private static void OnUnknownEventArgs(EventArgs e)
{
    Console.WriteLine(String.Format("Unknown event args ({0}): {1}", e.GetType(), e);
}

private static void Main(string[] args)
{
    MyMethod(null, new EventArgs());
    MyMethod(null, new MyEventArgs());
    MyMethod(null, new AnotherEventArgs());

    Console.ReadKey();
}

答案 3 :(得分:1)

您是否考虑过使用方法重载? 一般来说,我会尽量避免使用视图异常来切换案例块,因为它们通常是一种气味,继承,重载等可以以更好的方式解决问题。

BR

答案 4 :(得分:0)

只是为了完整性,工作,但你应该这样做,原因应该非常明显:

void MyMethod(object sender, EventArgs e)
{
    switch(e.GetType().FullName)
    {
        case "MyNamespace.MyEventArgs":
            //seriously, don't do this.
            break;
        case "System.EventArgs":
            //this is the worst idea ever.
            break;
        default:
            break;
    }
}