Frage

ich das falsch fragen kann, kann aber / wie kann man finden Felder für eine Klasse in mir ... zum Beispiel ...

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();
}

Oder vielleicht bin ich das nur falsch machen ... Wie kann ich eine Methode aufrufen und dann für Attribute überprüfen, um sich selbst angewendet?

Auch im Interesse der Frage - Ich bin nur neugierig, ob es möglich war, Informationen zu finden Attribute , ohne zu wissen / Zugriff auf die übergeordnete Klasse

War es hilfreich?

Lösung

Wenn ich Ihre Frage richtig verstanden habe, denke ich, was Sie versuchen möglich zu tun, ist nicht ...

In der Render Methode, mögen Sie auf das Objekt angewendet ein mögliche Attribut erhalten. Das Attribut gehört zu dem Feld _SecondPart Hexe zur Klasse HtmlForm gehört.

Für das arbeitet Sie das anrufende Objekt in der Render Methode übergeben müßten:

    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");
            }
        }
    }

Andere Tipps

Hier ist ein Beispiel gegeben, wie ein einzelnes Objekt zu finden, wenn eine öffentliche oder private Felder für das Objekt eine bestimmte Eigenschaft haben:

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);
    }

}

Für den zweiten Teil Ihrer Frage können Sie überprüfen, ob ein Attribut auf der aktuellen Methode defiend verwendet:

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

Bearbeiten

Zur Beantwortung Ihrer bearbeiten ja es möglich ist, ohne den tatsächlichen Typ zu kennen. Die folgende Funktion nimmt einen Typ Parameter und gibt alle Felder, die ein bestimmtes Attribut haben. Jemand irgendwo wird den Typ entweder wissen Sie suchen möchten, oder eine Instanz des Typs haben Sie suchen möchten.

Ohne dass man müßte tun, wie Jon Skeet sagte der alle Objekte in einer Baugruppe aufzuzählen vorbei ist.

   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;
    }

Sie können innerhalb einer Klasse finden Felder Type.GetFields verwenden, und Sie können Attribute zu einem Feld mit MemberInfo.GetCustomAttributes oder IsDefined angewendet zu finden - aber wenn Sie alle Felder eines bestimmten Typs finden müssen, sind Sie gehen zu müssen:

  • Iterate über alle Baugruppen, die Sie suchen möchten
  • Iterate über alle Typen innerhalb jeder Baugruppe
  • Iterate über alle Felder innerhalb jeder
  • Überprüfen Sie das Vorhandensein / Nichtvorhandensein des Attributs für jedes Feld

Nun, wenn Sie wirklich versuchen, um herauszufinden, „ist ein bestimmtes Attribut auf ein Feld angelegt, dessen Wert ein Verweis auf‚dieses‘Objekt“, dann ist das noch schwieriger - weil man jedes Objekt alle kennen müss Im System. Sie sollten auch bedenken, dass es sein könnte, zwei Felder beide mit dem gleichen Wert, das heißt das gleiche Objekt verweisen. Würde das Objekt gilt als „optional“ in diesem Fall oder nicht?

Grundsätzlich, wenn das Objekt eine Eigenschaft haben sollte (z optional oder nicht), dann muss, dass eine Eigenschaft des Objekts selbst, nicht das Feld, das die Eigenschaft enthält.

Es könnte sein, dass ich falsch interpretiert, was Sie zu tun versuchen, aber ich verdächtigt es ist entweder nicht möglich oder zumindest nicht eine gute Idee. Könnten Sie das größere Bild hier erklären? Was wollen Sie wirklich mit diesem Attribut erreichen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top