2012-01-20 9 views
5

Reflectionを使用して動的プロパティをクラスに追加しています。しかし、新しい/動的なプロパティを見つけることができません。.NET Reflection:動的プロパティを取得できません

プロセス:私はICustomTypeDescriptorインターフェイスを実装することによってDynamicClassを作成し、GetPropertiesIが、私は更新されたプロパティを取得するためにここに私のすべての操作をしましたが、それは動作していない機能を実装しています。..

マイDynamicClassコードはこちら:

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 

}

+5

'GetProperties()'は、インスタンスではなく、コンパイル時に 'type'を反映します。だからあなたは新しい特性を見ていないのです。 –

+0

どうすればいいですか? –

+0

下記の私の答えを参照してください。 –

答えて

3

System.ComponentModel.TypeDescriptor.GetProperties()メトを使用し、オブジェクトのランタイム・プロパティを取得しますdの代わりにType.GetProperties()メソッドを使用します。このメソッドは、typeのコンパイル時のプロパティのみを取得します。

+0

プロセスがICustomTypeDescriptor.GetProperties()関数を起動しない... ... !! –

+0

あなたがしたいことは、不必要に複雑に思えます。 C# 'dynamic'キーワードでは十分ではないでしょうか(どのバージョンのフレームワークを使用していますか?) http://stackoverflow.com/questions/6166236/add-properties-at-runtimeを参照し、http://blogs.msdn.com/b/parthopdas/archive/2006/01/03/509103をご覧ください。 .aspx、下部近くに。 –

関連する問題