为歧义的构造函数引用声明解析

时间:2018-12-06 06:30:02

标签: c#

考虑以下课程

    class Foo
    {
        public Foo(IBar bar=null)
        {                
        }
    }

我需要注入备用构造函数,以允许按需提供IBar实例,而不是注入。

    class Foo
    {
        public Foo(IBar bar=null)
        {                
        }

        public Foo(Func<IBar> barFunc) : this((IBar)null)
        {                
        }
    }

但是,在几个相关项目中有很多代码,例如:

        Foo foo = new Foo(null);

由于构造函数引用不明确,该代码无法再编译。

很明显,我可以将代码更改为

        Foo foo = new Foo((IBar)null);

但是,这需要更改整个项目,而我的目标是透明的更改。如果模棱两可,有什么方法可以指定要调用的构造函数?或者一种向编译器指示barFunc不能为空的方法

此刻,我正在查看,但是感觉....很脏

    class Foo
    {
        public Foo(IBar bar=null)
        {

        }

        public Foo(Func<IBar> barFunc, bool notUsed) : this((IBar)null)
        {

        }
    }

2 个答案:

答案 0 :(得分:2)

也许使用静态方法ala构造函数惯用法:

class Foo
{
    ...
    public static Foo Create(Func<IBar> func)
    {
        return new Foo(func());
    }
}

答案 1 :(得分:1)

Foo(Func<IBar>)构造函数设为私有,并添加一个工厂方法:

public static Foo WithIBarFunc(Func<IBar> func) {
    return new Foo(func);
}

如果可以,请一起删除Foo(Func<IBar>)构造函数,并编写如下方法:

public static Foo WithIBarFunc(Func<IBar> func) {
    var foo = new Foo(null);

    // initialise foo with func...
    return foo;
}