17

私はこれを間違って尋ねているかもしれませんが、クラス内のフィールドを見つけることができます/どのようにできますか...たとえば...

public class HtmlPart {
  public void Render() {
    //this.GetType().GetCustomAttributes(typeof(OptionalAttribute), false);
  }
}

public class HtmlForm {
  private HtmlPart _FirstPart = new HtmlPart();      
  [Optional] //<-- how do I find that?
  private HtmlPart _SecondPart = new HtmlPart();
}

または、これを間違って行っているだけかもしれません...メソッドを呼び出して、それ自体に適用されている属性を確認するにはどうすればよいですか?

また、質問のために-親クラスを知らずに/アクセスせずに属性情報を見つけることができたかどうか、私はただ興味があります!

4

3 に答える 3

14

あなたの質問を正しく理解していれば、あなたがやろうとしていることは不可能だと思います...

このRenderメソッドでは、オブジェクトに適用可能な属性を取得したいと考えています。属性はフィールド_SecondPartwitch に属し、class に属しHtmlFormます。

それが機能するには、呼び出し元のオブジェクトをRenderメソッドに渡す必要があります。

    public class HtmlPart {
        public void Render(object obj) {
            FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            foreach (var fi in infos)
            {
                if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true))
                    Console.WriteLine("Optional is Defined");
            }
        }
    }
于 2009-04-29T17:08:58.783 に答える
10

特定のオブジェクトのパブリック フィールドまたはプライベート フィールドに特定のプロパティがあるかどうかを調べる方法の例を次に示します。

var type = typeof(MyObject);
foreach (var field in type.GetFields(BindingFlags.Public |
             BindingFlags.NonPublic | BindingFlags.Instance))
{
    if (field.IsDefined(typeof(ObsoleteAttribute), true))
    {
        Console.WriteLine(field.Name);
    }

}

質問の 2 番目の部分では、次を使用して、現在のメソッドで属性が定義されているかどうかを確認できます。

MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute));

編集

編集に「はい」と答えるには、実際のタイプを知らなくても可能です。次の関数は、タイプ パラメータを取り、特定の属性を持つすべてのフィールドを返します。どこかの誰かが、検索したいタイプを知っているか、検索したいタイプのインスタンスを持っているでしょう。

それがなければ、Jon Skeet が言ったように、アセンブリ内のすべてのオブジェクトを列挙する必要があります。

   public List<FieldInfo> FindFields(Type type, Type attribute)
    {
        var fields = new List<FieldInfo>();
        foreach (var field in type.GetFields(BindingFlags.Public |
                           BindingFlags.NonPublic |
                           BindingFlags.Instance))
        {
            if (field.IsDefined(attribute, true))
            {
                fields.Add(field);
            }

        }
        return fields;
    }
于 2009-04-29T16:46:13.970 に答える
4

を使用してクラス内のフィールドを見つけることができ、またはType.GetFieldsを使用してフィールドに適用された属性を見つけることができますが、特定のタイプのすべてのフィールドを見つける必要がある場合は、次のようにする必要があります。MemberInfo.GetCustomAttributesIsDefined

  • 検索するすべてのアセンブリを反復処理します
  • 各アセンブリ内のすべての型を反復します
  • 各タイプ内のすべてのフィールドを反復します
  • フィールドごとに属性の有無をチェック

さて、「値が「この」オブジェクトへの参照であるフィールドに適用される特定の属性であるか」を本当に調べようとしている場合、それはさらに困難です-システム内のすべてのオブジェクトについてすべてを知る必要があるためです. また、同じ値を持つ、つまり同じオブジェクトを参照する2 つのフィールドが存在する可能性があることにも注意してください。その場合、オブジェクトは「オプション」としてカウントされますか?

基本的に、オブジェクトがプロパティを持つ必要がある場合 (オプションかどうかなど)、それはプロパティを含むフィールドではなく、オブジェクト自体のプロパティである必要があります。

あなたがやろうとしていることを私が誤解している可能性がありますが、それ実現可能ではないか、少なくとも良い考えではないと思います. ここで全体像を説明していただけますか?この属性で実際に何を達成しようとしていますか?

于 2009-04-29T16:43:31.793 に答える