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

Alp*_*der 3 c# constructor metaprogramming

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

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

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

Jak*_*rtz 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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

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