0

类的构造函数是否可以在自身周围包装代理?不幸的是,这段代码会导致 StackOverflowException。

void Main()
{
    var thing = new Thing();
}

public static readonly ProxyGenerator generator = new ProxyGenerator();

public class Thing
{
    public Thing()
    {
        generator.CreateClassProxyWithTarget(this);
    }
}

我想要某种方法来保证我的类的新实例被包装在代理中,而不是必须创建某种创建代理实例的工厂。

4

2 回答 2

0

据我所知,不支持您想要的。如果你有一个公共的、无参数的构造函数,任何人都可以创建你的类。

现在,这并不意味着你不能得到你想要的——它只是需要更多的工作。您可以在范围为内部的类上有一个“初始化”标志(只有程序集中的类可以访问它)。工厂将用于创建代理实例并将初始化标志设置为 true。只有工厂会设置这个标志。类中的每个公共方法都可以执行检查以确保“已初始化”标志为真,如果为假则抛出异常(这是“更多工作”的来源——您必须手动将此检查添加到每种方法)。由于它的范围,新的实例无法设置初始化标志。

这不会阻止某人新建您的课程,但至少会阻止他们使用它。至于序列化,您可能希望拥有一些仅数据类并序列化那些而不是代理类。

于 2012-08-12T03:30:11.980 回答
0

我最接近的是创建一个返回代理的单例。这是一个例子:

public class MySingleton
{
    protected static MySingleton _instance = null;
    public static MySingleton Instance
    {
        get
        {
            if (_instance == null)
            {
                if (Simple.UseDynamicProxies)
                    _instance = Simple.GetProxy(typeof(MySingleton));
                else
                    _instance = new MySingleton();
            }
            return _instance;
        }
    }
}

请注意,Simple 类包含实际创建代理、拦截和日志记录等的“繁重工作”以及 UseDynamicProxies 标志,因此我可以在整个解决方案中打开/关闭代理使用。

于 2014-01-16T22:07:35.557 回答