Reflection: Object aus PropertyInfo incl. der CustomAttributes erzeugen!?

MarioR

Mitglied
Hallo,

ich habe da ein kleines Problem ;-)

Code:
...
foreach (PropertyInfo property in beanObjectType.GetProperties())
{
// z.B. [DisplayName("HalloIchBinEs")]...
  DisplayNameAttribute temp = ((DisplayNameAttribute)Attribute.GetCustomAttribute(property, typeof(DisplayNameAttribute)));
...
// erzeugen eines Objektes dieser Property
Object objectOfProperty = Activator.CreateInstance(property.PropertyType);
...
}
...
Ich analysiere eine beliebige Klasse, besser deren Properties per Reflection.
Das lesen der Properties und deren CustomAttributes ist ja kein Problem.
Ich brauche am Ende ein/das Objekt dieser Property, was man ja mit dem Activator hinbekommt.

Wie bekommt dieses neu erzeugte Objekt aber die CustomAttributes der Property?

Gruß Mario
 
Zuletzt bearbeitet:
Die Attribute hängen ja eher an der Klassenbeschreibung, haben so direkt mit der Instanz nixs zu tun.
Was genau hast du vorher?

Ich vermute erstmal das du alle weiteren Sachen mit dem Typ Object machst,
wodurch du deine Eigenschaften/Attribute eventuell erstmal nicht wiederfindest.

Edit:
Ah ok habs kapiert du erstellt ja eine neue Instanz der Eigenschaft (dachte der Klasse, sry nicht ganz gelesen), in diesem fall musst du dir wohl das Attribute merken.
 
... erledig ...
Ich habe eine Möglichkeit gefunden:
Anhängen der Attribute an ein 'beliebiges Objekt'
C++:
Object objectOfProperty = Activator.CreateInstance(property.PropertyType);
TypeDescriptor.AddAttributes(objectOfProperty, Attribute.GetCustomAttributes(property));

Abfragen der angehängten Attribute:
C++:
AttributeCollection attributes = TypeDescriptor.GetAttributes(objectOfProperty);

Da die AttributCollection bei get(Type) auf ein nicht vorhandenen Typ 'etwas' zickig regiert habe ich dafür eine kleine Helferklasse geschrieben. Das dort geschriebene get gibt wenn der Typ nicht vorhanden ist null zurück.
Die Auswertung kann dann etwa so erfolgen:
C++:
DisplayNameAttribute dispBeanNameAttribute = (DisplayNameAttribute)AttributeCollectionHelper.get(attributes,typeof(DisplayNameAttribute));
if (dispBeanNameAttribute != null)
  beanTagName = dispBeanNameAttribute.DisplayName;
else
  beanTagName = dataBean.GetType().Name;

hier noch die kleine Helferklasse
C++:
    /// <summary>Helferklasse für die AttributCollection</summary>
    public class AttributeCollectionHelper
    {
        /// <summary>gibt bei nicht vorhandensein des AttributTyps null zurück</summary>
        /// <param name="fromthis"></param>
        /// <param name="attributeType"></param>
        /// <returns></returns>
        public static Attribute get(AttributeCollection fromthis, Type attributeType)
        {
            Attribute result = null;
            foreach (Attribute item in fromthis)
            {
                if (item.GetType() == attributeType)
                {
                    result = item;
                    break;
                }
            }
            return result;
        }
 
        /// <summary>Gibt eine AttributColletion des ObjectArray zurück</summary>
        /// <param name="fromthis">Object[] z.B. von property.GetCustomAttributes(true)</param>
        /// <returns></returns>
        public static AttributeCollection getCollection(Object[] fromthis)
        {
            if (fromthis != null)
            {
                if (fromthis.Length > 0)
                {
                    List<Attribute> tempList = new List<Attribute>();
                    foreach (Object item in fromthis)
                    {
                        Attribute tempAttrib = item as Attribute;
                        if (tempAttrib != null)
                            tempList.Add(tempAttrib);
                    }
                    if (tempList.Count > 0)
                        return new AttributeCollection(tempList.ToArray());
                }
            }
            return new AttributeCollection();
        }
    }
 
Zurück