在调用另一个构造函数之前更改值

时间:2015-07-22 20:17:47

标签: c#

我一直在努力创造一些"级联"构造函数。一个人用另外的信息调用另一个。我到目前为止看到的两个。

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()更具实质性,但我用它来证明这一点。

4 个答案:

答案 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类型上重载运算符,所以你在这里运气不好。