在Enum上的IoC,就像我们在c#中使用Interface来处理类一样

本文关键字:处理 Interface 一样 IoC 上的 Enum 我们 | 更新日期: 2023-09-27 18:06:02

我想有一个方法,它只能接受我创建的两个/三个enums

如果不是Enum,如果我们说for class,我们可以用Interface来做。

class A :IMyInterface
{
}
class B :IMyInterface
{
}
class C :IMyInterface
{
}
public class Test
{
  public void MyTestMethod(IMyInterface classA_B_C)
  {
  }
}
同样的,如果我有
public enum A{}
public enum B{}
public enum C{}

我想要一个方法

public void MyEnumTesting(AnyEnumA_B_C)  <--

所以我想要一种方法从我声明的2/3中传递一个Enum

它不是Enum "Inheritance"的副本。我不希望两个枚举都有相同的值。我想要一个方法,可以接受任何一个两个枚举

在Enum上的IoC,就像我们在c#中使用Interface来处理类一样

要实现该功能,请使用方法重载:

public void MyEnumTesting(A enumA);
public void MyEnumTesting(B enumB);
public void MyEnumTesting(C enumC);

在包含类中,只需添加这3个名称相同但参数类型不同的方法。

如果你希望将来有更多的枚举,你想通过这个方法来支持,那么我建议你把你的类定义为局部的,在你定义enam的每个文件中,只要通过添加这个方法来扩展这个局部类。

文件交流

enum A{...}
partial class MyClass
{
    public void MyEnumTesting(A enumA);
}

文件公元前

enum B{...}
partial class MyClass
{
    public void MyEnumTesting(B enumB);
}

对于枚举没有更通用的引用,但是您可以通过设计来实现此功能:

    public class AWrapper: IMyInterface
    {
      public A Value;
      public enum A{}
    }
    public class BWrapper: IMyInterface
    {
      public B Value;
      public enum B{}
    }
    public class CWrapper: IMyInterface
    {
      public C Value;
      public enum C{}
    }

然后你可以用类的方式来写,但是混合使用一些枚举…

public class Test
{
  public void MyTestMethod(IMyInterface classA_B_C)
  {
  }
}

您可以尝试使用带有一组隐式操作符的中介:

public enum A { A1, A2, A3 }
public enum B { B1, B2, B3  }
public enum C { C1, C2, C3 }
public class A_B_C_Caster
{
    public int Value { get; private set; }
    private A_B_C_Caster() {}
    public static implicit operator A_B_C_Caster(A value) { return new A_B_C_Caster() {Value = (int) value}; }
    public static implicit operator A_B_C_Caster(B value) { return new A_B_C_Caster() {Value = (int) value}; }
    public static implicit operator A_B_C_Caster(C value) { return new A_B_C_Caster() {Value = (int) value}; }
}

像这样使用:

public class Test
{
    public void TestCallingMyTestMethod()
    {
        this.MyTestMethod(A.A1);
        this.MyTestMethod(B.B1);
        this.MyTestMethod(C.C1);
    }
    public void MyTestMethod(A_B_C_Caster classA_B_C)
    {
        var value = classA_B_C.Value;
    }
}

上面的方法通过A_B_C_Caster类的私有构造函数和隐式操作符将可接受的实参范围限制为只有三个枚举。在方法内部,您必须使用三个枚举的最小公分母类型,在本例中为int类型。

:

下面是一些caster类的通用版本。不幸的是,我不得不在这个版本的隐式操作符中做一个装箱操作。你可以使用Jon Skeet的Unconstrained Melody来解决这个问题。

public class MultiIntEnum<TRawType, TEnum1, TEnum2>
    where TEnum1 : struct
    where TEnum2 : struct
{
    public TRawType Value { get; private set; }
    private MultiIntEnum() {}
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2>(TEnum1 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2>(TEnum2 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2>() {Value = (TRawType) (object) value}; }
}
public class MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>
    where TEnum1 : struct
    where TEnum2 : struct
    where TEnum3 : struct
{
    public TRawType Value { get; private set; }
    private MultiIntEnum() {}
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>(TEnum1 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>(TEnum2 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>(TEnum3 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3>() {Value = (TRawType) (object) value}; }
}
public class MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>
    where TEnum1 : struct
    where TEnum2 : struct
    where TEnum3 : struct
    where TEnum4 : struct
{
    public TRawType Value { get; private set; }
    private MultiIntEnum() {}
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>(TEnum1 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>(TEnum2 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>(TEnum3 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>(TEnum4 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4>() {Value = (TRawType) (object) value}; }
}
public class MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>
    where TEnum1 : struct
    where TEnum2 : struct
    where TEnum3 : struct
    where TEnum4 : struct
    where TEnum5 : struct
{
    public TRawType Value { get; private set; }
    private MultiIntEnum() {}
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>(TEnum1 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>(TEnum2 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>(TEnum3 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>(TEnum4 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>() {Value = (TRawType) (object) value}; }
    public static implicit operator MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>(TEnum5 value) { return new MultiIntEnum<TRawType, TEnum1, TEnum2, TEnum3, TEnum4, TEnum5>() {Value = (TRawType) (object) value}; }
}

它们可以这样使用:

public class Test
{
    static void Main()
    {
        MyTestMethod(A.A1);
        MyTestMethod(B.B2);
        MyTestMethod(C.C3);
        Console.ReadKey();
    }
    static void MyTestMethod(MultiIntEnum<int, A,B,C> classA_B_C)
    {
        var value = classA_B_C.Value;
        Console.WriteLine(value);
    }
}