繁体   English   中英

如何安全地用枚举重载构造函数? C#

[英]How can I safely overload a constructor with enums? C#

我有这个代码

public enum MyEnumOne : byte { ... }
public enum MyEnumTwo : byte { ... }

public class MyClass
{
    public readonly MyEnumOne E1;
    public readonly MyEnumTwo E2;

    private MyClass(MyEnumOne e1)
    {
        E1 = e1;
    }

    private MyClass(MyEnumTwo e2)
    {
        E2 = e2;
    }

    public static MyClass CreateWithE1(MyEnumOne e1)
    {
        return new MyClass(e1);
    }

    public static MyClass CreateWithE2(MyEnumTwo e2)
    {
        return new MyClass(e2);
    }
}

我如何确保此代码将始终强制转换正确的构造函数重载?

var A = MyClass.CreateWithE1(0);
var B = MyClass.CreateWithE2(0);

我可以通过使该类可变来确保这一点,但是我不需要该类是可变的。

注意:如果我犯了使班级不可变的任何错误,请告诉我:)

编辑:两个枚举都有其第一个元素为None = 0并且在合法情况下可以创建一个枚举为None的实例。

编译 CreateWithE1 ,它包含对基于MyEnumOne的构造函数的调用。

同样,在编译 CreateWithE2时,它包含对基于MyEnumTwo的构造函数的调用。

调用这些方法中的任何一个时,要使用的构造函数已经固定,并且不基于参数的运行时值

当使用隐式转换调用任何重载方法时,就像int和enum之间一样,编译器会根据可转换类型来推断所需的方法,就像直接调用方法时一样。 但是,如果遇到歧义,那么它将仅抛出该错误-“歧义匹配”。

因此,上述构造函数将是安全的,但将强制任何实现显式指定他们想要传递的类型,以便编译器可以正确推断。 但是,由于您的方法包含特定的枚举,因此它们对于编译器是可区分的,从而使上述代码毫无问题地通过编译器。

如果要避免使用工厂方法,则可以执行以下操作

var A = new MyClass((MyEnumOne)0);
var B = new MyClass((MyEnumTwo)0);

确保阅读显式和隐式转换,以及编译器如何解决重载。

以最安全的方式实现的方法如下:

l_param.DbType =(DbType)Enum.Parse(typeof(DbType),param.dataType);

public readonly MyEnumOne E1;
public readonly MyEnumTwo E2;

private MyClass(MyEnumOne e1)
{
    E1 = (MyEnumTwo)Enum.Parse(typeof(MyEnumTwo), e1);
}

其他转换类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM