【问题标题】:Is there anyway I can intercept a new call?无论如何我可以拦截一个新电话吗?
【发布时间】:2016-01-09 06:31:16
【问题描述】:

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

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

这可能吗?如果可以,它的性能如何?

【问题讨论】:

  • 查找单例模式
  • @LucMorin 这有什么帮助?该类不是单例。
  • 恐怕我不明白这个问题。如果您这样做,请随时提供答案。
  • 不,你不能。除非您将构造函数设为私有并强制用户使用工厂方法创建新对象。

标签: c# constructor metaprogramming


【解决方案1】:

您必须修改已编译的 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)
    {

    }
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多