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

最も近いのは、プロキシを返すシングルトンを作成することです。次に例を示します。

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 に答える
0

私の知る限り、あなたが望むものはサポートされていません。パラメーターのない public コンストラクターがある場合は、誰でもクラスを作成できます。

これは、欲しいものが手に入らないという意味ではありません。もう少し手間がかかるだけです。内部スコープのクラスに「初期化済み」フラグを設定できます (アセンブリ内のクラスのみがアクセスできます)。ファクトリを使用して、プロキシされたインスタンスを作成し、初期化フラグを true に設定します。このフラグを設定するのは工場だけです。クラス内のすべてのパブリック メソッドは、チェックを実行して「初期化済み」フラグが true であることを確認し、false の場合は例外をスローします (ここで「追加作業」が発生します。このチェックを手動で追加する必要があります。すべての方法)。新しく作成されたインスタンスは、スコープが原因で初期化フラグを設定できません。

これは、誰かがあなたのクラスの 1 つを新しく作成することを妨げるものではありませんが、少なくともそのクラスを使用することはできなくなります。シリアライゼーションに関しては、おそらくいくつかのデータのみのクラスを持ち、プロキシされたクラスの代わりにそれらをシリアライズしたいと思うでしょう。

于 2012-08-12T03:30:11.980 に答える