等同于不能修改类的接口方法实现

时间:2018-04-10 11:29:10

标签: c# performance dynamic interface

假设我们有一个接口IInterface和几个实现此接口的类Class1,...,ClassN

我需要一个方法CheckSomething用于该接口的所有实现者。一种方法是使CheckSomething成为IInterface的方法,并为所有类实现它:

interface IInterface { bool CheckSomething(string arg); }
class Class1 : IInterface { public bool CheckSomething(string arg) { ... } }
...
class ClassN : IInterface { public bool CheckSomething(string arg) { ... } }

可能有理由将CheckSomething方法保留在类的代码之外(例如,我们无法修改类的代码;例如,方法CheckSomething不属于类语义-wise)。

为了仍然获得相同的行为,我们可以使用扩展方法:

static class MyExtensionMethods
{
    public static CheckSomething(this Class1 c, string arg) { ... }
    ...
    public static CheckSomething(this ClassN c, string arg) { ... }

    public static CheckSomething(this IInterface i, string arg) // option 1
    {
        dynamic dynI = i;
        return i.CheckSomething(arg);
    }
}

关于dynamic,每个人都警告它会给予性能惩罚,所以......

  • ...扩展方法版本比接口方法版本慢吗?多少?为什么?
  • ...有没有其他方法可以获得与接口方法版本相同的行为和相同的性能 - 无需修改类的代码?

1 个答案:

答案 0 :(得分:0)

由于您似乎已经引用了类的实现,因此您可能会选择一个或多或少丑陋的切换案例。我不知道性能。

public static class MyExtensionMethods
{
    public static CheckSomething(this IInterface i, string arg) // option 1
    {
        switch (i)
        {
             case i is Class1 class1:
                  // class specific implementation (maybe in a separate method)
             ...
        }
    }
}