2012-01-20 28 views
5

Yansıma yardımıyla bir sınıfa dinamik özellik ekliyorum. Ancak yeni/dinamik özellikler bulamıyor..NET Yansıma: Dinamik Özellikler alınamıyor Dinamik özellikler

Süreci: Ben burada bütün manipülasyon özelliklerini güncellenmesini vermedi ama çalışmıyor ICustomTypeDescriptor Arayüzü uygulayarak bir DynamicClass oluşturulan ve fonksiyon GetPropertiesI uygulayan var ..

Benim DynamicClass kodu burada :

+5

'GetProperties(), örnek değil, derleme zamanı türünü yansıtır. Bu yüzden yeni özellikleri görmüyorsun. –

+0

Peki bana ne yapacağımı söyle? –

+0

Cevabımı aşağıya bakın. –

cevap

3

bir nesnenin çalışma özellikleri almak için

public class DynamicClass : ICustomTypeDescriptor 
{ 
    // Collection to code add dynamic properties 
    /* 
    KeyedCollection<string, DynamicProperty> _properties; 
    public KeyedCollection<string, DynamicProperty> Properties 
    { 
     get;// { return _properties; } 
     set;// { _properties = value; } 
    } 
    */ 
    public void AddProperty(DynamicProperty _property) 
    { 
     PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    // Fill property collection with founded properties 
    PropertyDescriptorCollection propsCollection = 
     new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray()); 

    propsCollection.Add(new DynamicPropertyDescriptor(
     _property.ComponentType, 
     _property.PropertyName, 
     _property.PropertyType, 
     _property.Component, 
     _property.Value 
    )); 
} 

public void AddProperties(KeyedCollection<string, DynamicProperty> _properties) 
{ 
    PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    // Fill property collection with founded properties 
    PropertyDescriptorCollection propsCollection = 
     new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray()); 

    foreach (var p in _properties) 
    { 
     propsCollection.Add(new DynamicPropertyDescriptor(
      p.ComponentType, 
      p.PropertyName, 
      p.PropertyType, 
      p.Component, 
      p.Value 
      )); 
    } 
} 

PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() 
{ 
    PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    PropertyDescriptorCollection propsCollection = 
     new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray()); 
    return propsCollection; 
} 

// ICustomTypeDescriptor implementation 
PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties() 
{ 
    // Properties founded within instance 
    PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    // Fill property collection with founded properties 
    PropertyDescriptorCollection propsCollection = 
     new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray()); 
    //propsCollection.Cast.<CustomPropertyDescriptor>().Concat(Properties).ToArray(); 

    // Fill property collection with dynamic properties (Properties) 

    //List<DynamicPropertyDescriptor> _dynamicPropertyDescriptors = new List<DynamicPropertyDescriptor>(); 

    //instanceProps.Cast<DynamicPropertyDescriptor>().Concat().ToArray(); 
    return propsCollection; 
} 

#region ICustomTypeDescriptor Members 

public System.ComponentModel.AttributeCollection GetAttributes() 
{ 
    throw new NotImplementedException(); 
} 

public string GetClassName() 
{ 
    throw new NotImplementedException(); 
} 

public string GetComponentName() 
{ 
    throw new NotImplementedException(); 
} 

public TypeConverter GetConverter() 
{ 
    throw new NotImplementedException(); 
} 

public EventDescriptor GetDefaultEvent() 
{ 
    throw new NotImplementedException(); 
} 

public PropertyDescriptor GetDefaultProperty() 
{ 
    throw new NotImplementedException(); 
} 

public object GetEditor(Type editorBaseType) 
{ 
    throw new NotImplementedException(); 
} 

public EventDescriptorCollection GetEvents(Attribute[] attributes) 
{ 
    throw new NotImplementedException(); 
} 

public EventDescriptorCollection GetEvents() 
{ 
    throw new NotImplementedException(); 
} 

public PropertyDescriptorCollection GetProperties(Attribute[] attributes) 
{ 
    PropertyInfo[] instanceProps = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    PropertyDescriptorCollection propsCollection = 
     new PropertyDescriptorCollection(instanceProps.Cast<PropertyDescriptor>().ToArray()); 
    return propsCollection; 

    /* 
    if (!this.DesignMode) 
    { 
     PropertyDescriptorCollection collection = TypeDescriptor.GetProperties(this, attributes, true); 

     PropertyDescriptorCollection newList = new PropertyDescriptorCollection(new PropertyDescriptor[0]); 

     foreach (PropertyDescriptor prop in collection) 
     { 
      Attribute a = prop.Attributes[typeof(CategoryAttribute)]; 

      if (a != null && ((CategoryAttribute)a).Category == "SixDisciplines") 
       newList.Add(prop); 
     } 

     return newList; 
    } 
    else 
     //The control must be passed to the method. 
     return TypeDescriptor.GetProperties(this, attributes, true); 
    */ 
} 

public object GetPropertyOwner(PropertyDescriptor pd) 
{ 
    throw new NotImplementedException(); 
} 

#endregion 

} System.ComponentModel.TypeDescriptor.GetProperties() metoksi kullanımı d, yalnızca type'un derleme zamanı özelliklerini alan Type.GetProperties() yönteminin yerine.

+0

işlem işlevi ICustomTypeDescriptor.GetProperties() ... !! –

+0

Yapmak istediğin şey gereksiz yere karmaşık görünüyor. C# '' dinamik' anahtar kelimesinin yeterli olmayacağından (çerçevenin hangi sürümünü kullandığınızdan) emin misiniz? Http://stackoverflow.com/questions/6166236/add-properties-at-runtime adresine bakın ve http://blogs.msdn.com/b/parthopdas/archive/2006/01/03/509103 adresine bakın. .aspx, tabana yakın. –