0

反射に問題があります。静的メンバーをインスタンス化する型を見つける必要があります。私のコードは次のようになります。

    private class SimpleTemplate : PageTemplate
    {
        internal static readonly IPageProperty NameProperty =
            PropertyRepository.Register("Name");
    }

PropertyRepository は、(明らかに) プロパティのリポジトリです。私が構築している型システムを使用して登録されたすべてのプロパティを追跡します。

これを成功させるには、すべてのプロパティだけでなく、それらが定義されている型も追跡する必要があります。そうしないと、同じ名前の 2 つのプロパティが定義されている場合、プロパティ リポジトリはそれらを区別できません。

そこで、NameProperty を定義する型を見つけて、その型と名前を保存したいと思います。どうやってやるの?

厳密な型指定を使用したい、つまり、型を引数として PropertyRepository.Register に送信したくない。型引数が正しいことを検証できないため、エラーが発生しやすくなります。

解決策には、熟考が必要だと思います。リフレクションを使用して、どの型が静的メソッドを呼び出すかを判断する方法はありますか? 静的プロパティは、(コンパイラが生成する) 静的コンストラクターを使用して暗黙的にインスタンス化されます。そのコンストラクターへのハンドルを取得する方法はありますか? それは実現可能のようですが、それを行う方法がわかりません。

つまり、メソッド A がメソッド B を呼び出した場合、B がリフレクションを使用して A から呼び出されたことを知る方法はありますか? あると思いますが、方法がわかりません。

誰か知っていますか?

編集:私は StackFrame クラスを見てきましたが、それは私が望むことをしているように見えますが、本番コードでは信頼できないかもしれません(そして私はそれが必要です)。

4

1 に答える 1

2

これはこの質問とほぼ同じですが、完全ではありませ。しかし、その人の答えを見てください。

個人的には、タイプを渡すと思います。別の方法は、属性を使用することです。

[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;

static
{
    PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}

PropertyRepostiory.RegisterProperties次に、リフレクションを使用して読み取り専用フィールドの値を設定できます(これが機能する場合-試したことはありません。読み取り専用が強制される可能性があります)。ちょっと面倒ですが... または、必要なときにリポジトリからプロパティを取得することもできます。

于 2008-12-27T19:31:56.707 に答える