无论如何我可以拦截新的电话吗?

时间:2015-10-11 20:43:07

标签: c# constructor metaprogramming

我有一个我想要缓存的类型,因为它是不可变的,如果你调用new Foo(1),它会创建它但是也会将该实例添加到缓存中,如果你再做一次,您最终会得到值为1的缓存Foo

这意味着我需要拦截调用new <Type>(),而是使用自定义逻辑。

这是否可能,如果可行,它的表现如何?

2 个答案:

答案 0 :(得分:5)

您必须修改已编译的IL。它很难实现和不可读。任何看到new的人都希望创建一个新实例。

更好地使用静态工厂方法:

public class Foo
{
    public static Foo GetInstance(int parameter)
    {
        if (FooCache.IsCached(parameter))
        {
            // return instance from cache
        }
        else
        {
            Foo instance = new Foo(parameter);
            // add to cache
            return instance;
        }
    }

    private Foo(int parameter)
    {

    }
}

请注意,构造函数是私有的。获取此类实例的唯一方法是使用工厂方法。

答案 1 :(得分:0)

执行此操作的标准方法是使用Factory Pattern和私有构造函数。私有构造函数意味着类之外的代码不能使用new Foo(1),而是会编写类似Foo.newFoo(1);的内容,它将保留逻辑以创建新的Foo或返回缓存的值