Announcement

Collapse
No announcement yet.

CustomAttributes für komplekse Eigenschaften - gibt es einen Umweg?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CustomAttributes für komplekse Eigenschaften - gibt es einen Umweg?

    Hallo,
    ich dachte die genze Zeit "naiv", dass die CustomAttributes für alle möglichen öffentlichen Eigenschaften funktionieren. Eben nach einer Überraschung mit meinem eigenen Code habe ich erfahren, dass die nur auf einfache Typen beschränkt sind (int, string, usw.) und auch auf Kollektionen.

    So etwas wie
    Code:
    public class CampaignGoals
    {
      public int Users {get;set;}
      public int MaximumUsers {get;set;}
      public int ContactsPerUser {get;set;}
    }
    , wo
    Code:
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
    public class ObjectFormatAttribute : System.Attribute
    {
      //..
    }
    und
    Code:
    public class Campaign
    {
      //...
      [ObjectFormat()]
      public CampaignGoals  {get;set;}
      //...
    }
    scheint nicht möglich zu sein. Funktioniert zumindest nicht für mich: in der Liste der Properties mit diesem Attribute erscheint Goals nicht.

    Frage: kennt vielleicht jemand einen (eleganten) Umweg? (Einen nicht-eleganten weiß ich selbst: es genügt, einen Array von dem Typ zu erklären, und gleich wird alles funktionieren - halte ich aber für schlechten Stil.)

    Sehr dankbar für mögliche Ideen!

  • #2
    Warum Umweg? Das sollte so schon funktionieren.

    in der Liste der Properties mit diesem Attribute erscheint Goals nicht.
    Hier vermute ich das Problem. Wie hast du diese Liste erstellt? Ich hab gerade mit folgenden Code probiert und kein Problem abhängig vom Typ der Property (Valuetype oder Referencetype bzw Listen davon) feststellen können.

    [Highlight=C#]
    public class Class1
    {
    [ObjectFormat()]
    public Class1 meineLiebeClass1Property { get; set; }

    [ObjectFormat()]
    public Int32 meineLiebeInt32Property { get; set; }

    [ObjectFormat()]
    public List<Class1> meineLiebeListClass1Property { get; set; }

    [ObjectFormat()]
    public List<Int32> meineLiebeListInt32Property { get; set; }

    static void Main(string[] args)
    {
    Class1 c = new Class1();
    foreach (var propinfo in c.GetType().GetProperties())
    if (propinfo.GetCustomAttributes(typeof(ObjectFormatA ttribute), true).FirstOrDefault() != null)
    Console.WriteLine(propinfo.Name);
    }
    }[/Highlight]

    Comment


    • #3
      Dein Beispiel funktioniert

      Hallo Ralf, danke!
      das Beispiel funtioniert, und auch nach ein paar weiteren Änderungen.
      In meinem Code aber nicht, also muß ich suchen, was dort anders ist, als im Beispiel (am 1. Blick nichts )

      Irritiert hat mich die folgende Definition von http://www.codeproject.com/KB/cs/attributes.aspx (und einigen weiteren):
      "The types of parameters for an attribute class are limited to:

      * bool,
      * byte,
      * char,
      * double,
      * float,
      * int,
      * long,
      * short,
      * string
      * System.Type
      * object
      * An enum type,..."

      Comment


      • #4
        Property kann nicht Instanz einer inneren Klasse sein

        Hallo Ralf,
        inzwischen weiß ich die Ursache:
        wenn die Property Instanz einer inneren Klasse ist, funktionieret CustomProperty über diese Eigenschaft nicht. Eben getestet und festgestellt. Warum, unbekannt, aber Faktum.

        Nochmals danke!

        Comment


        • #5
          Code:
          The types of parameters for an attribute class are limited to:
          Das bezieht sich auf die Parameter die man an das Attribut übergeben kann nicht auf Typen von Properties die man mit diesem Attribut dann attributieren kann.

          Dein Problem kann ich auch mit inneren Klassen nicht nachvollziehen. Wenn ich die Klasse class1 in meinem Beispiel um eine innere Klasse erweitere kann ich die ebenfalls Problemlos attributieren.

          [Highlight=C#]
          class Class1
          {
          [ObjectFormat()]
          public Class2 meineLiebeClass2Property { get; set; }

          public class Class2
          {
          [ObjectFormat()]
          public Class1 meineLiebeClass1Property { get; set; }

          [ObjectFormat()]
          public Int32 meineLiebeInt32Property { get; set; }

          [ObjectFormat()]
          public List<Class1> meineLiebeListClass1Property { get; set; }

          [ObjectFormat()]
          public List<Int32> meineLiebeListInt32Property { get; set; }
          }

          static void Main(string[] args)
          {
          Class1 c = new Class1();
          // Class1.Class2 c = new Class1.Class2(); // für die Properties der inneren Klasse

          foreach (var propinfo in c.GetType().GetProperties())
          if (propinfo.GetCustomAttributes(typeof(ObjectFormatA ttribute), true).FirstOrDefault() != null)
          Console.WriteLine(propinfo.Name);
          Console.ReadLine();
          }
          }
          [/Highlight]

          Comment


          • #6
            Also, vielleicht liegt es an der .NET-Version? Ich arbeite mit 3.5. Ansonsten eine Win7 Maschine, ob es eine Rolle spielen kann?
            Die Situation sieht bei mir aber wie von mir berichtet aus. Allerdings, ich habe die inneren Klassen einfach selbständig gemacht, und seitdem ist alles OK, so dass das problem für mich an Schärfe verloren hat.
            Danke allenfalls für die Unterstützung und die Möglichkeit, Sachen zu besprechen.

            Comment

            Working...
            X