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

Is there anyway I can intercept a new call?

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

的缓存 Foo

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

这是否可能,如果可能,其性能如何?

执行此操作的标准方法是使用工厂模式和私有构造函数。私有构造函数意味着 class 之外的任何代码都不能使用 new Foo(1),但是您将编写类似 Foo.newFoo(1); 的代码,它将包含创建新的 Foo 或return 一个缓存值。

您将不得不修改已编译的 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)
    {

    }
}

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