我一直在努力创造一些"级联"构造函数。一个人用另外的信息调用另一个。我到目前为止看到的两个。
public scan() : this(Environment.Local) { }
public scan(Environment env) {
//it then does some stuff constructor-y things
}
我想通过接受一个字符串来调用我的第二个构造函数,然后将其转换为Environment
。有这样的效果:
public scan(string environment) : this(environment.toString()}
但它似乎并不想工作我希望如何工作。有没有办法传递这个字符串然后调用我的其他环境接受构造函数?
此外,我希望做出的改变比仅仅toString()
更具实质性,但我用它来证明这一点。
答案 0 :(得分:1)
ToString
无法正常工作,因为您最终以递归方式调用构造函数(加上ToString
上的调用string
并没有多大意义。听起来你想要Parse
字符串到Environment
值:
public scan(string environment) :
this((Environment)Enum.Parse(typeof(Environment),environment))
{
}
但是由于无效的字符串值而无法在编译时捕获,因此存在抛出异常的风险。
答案 1 :(得分:1)
我会这样做:创建一个处理从字符串转换为枚举的静态方法。在此静态方法中,检查有效性,如果不是,则返回本地。
public class scan
{
public scan(Environment value) { }
public scan() : this(Environment.Local) { }
public scan(string s) : this(ParseEnum(s)) { }
private static Environment ParseEnum(string s)
{
// default to local
Environment value = Environment.Local;
// try parsing the string
Enum.TryParse<Environment>(s, out value);
// if sucessful, the new value will be returned
// if not, Environment.Local will be returned
return value;
}
public enum Environment
{
Local,
NotLocal,
AnotherOne
}
}
答案 2 :(得分:0)
没有。你不能在其他构造函数的中调用构造函数,或者在调用其他ctor之前,在构造函数中使用参数做一些传递给其他构造函数的东西。是的,您可以调用其他构造函数并传递方法执行的结果,如ctor() : this(MyMethod())
,但它仍然与从您的ctor 内部调用其他构造函数不同。
通常使用的是:
public scan() { // general initialization logic }
public scan(Environment env) : this()
{
//some special logic here that uses parameter env
}
或类似于Windows窗体InitializeComponent
方法。包含初始化逻辑的初始化方法。
答案 3 :(得分:0)
如果Environment
是结构或类,那么你可以覆盖转换运算符并重写你的构造函数:
public scan(string environment) : this((Environment)environment)
不允许在Enum类型上重载运算符,所以你在这里运气不好。