![](/img/trans.png)
[英]How Can I Redesign My C# Application To Avoid Constructor Injection Overload?
[英]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.