2016-04-06 11 views
0

こんにちは私は他の複合型の中にある複合型の拡張可能なコレクションを持っていたいと思います。任意のコレクション(複合グリッド)の複合型内で消費可能な複合型

private static void SetExpandableAttrForType(Type type) 
    { 
     var props = type.GetProperties(); 
     foreach (var prop in props.Where(x =>!x.PropertyType.IsSimpleType()&& x.CanWrite)) 
     { 
      SetExpandableAttrForType(prop.PropertyType); 
     } 
     TypeDescriptor.AddAttributes(type, new TypeConverterAttribute(typeof (ExpandableObjectConverter))); 
    } 

、その後

SetExpandableAttrForType(arrayInstance.GetType().GetElementType()); 

テストモデル::

public class Class1 
{ 
    public Class2 Class2Inclass1 { get; set; } 
    public Class2[] Class2Array { get; set; } 
} 


public class Class2 
{ 
    public Class3 Class3Inclass2 { get; set; } 
    public string Class2String { get; set; } 
    public string Class2String2 { get; set; } 
} 


public class Class3 
{ 
    public Class4 Class4Inclass3 { get; set; } 
    public string Class3String { get; set; } 
    public int Class3Int { get; set; } 
} 

public class Class4 
{ 
    public int Class4Int { get; set; } 
    public DateTime Class4Datetime { get; set; } 
} 

それはタイプのためではなく、型のコレクションのために正常に動作します私はこれをしたいどのように 。

答えて

0

プログラミングに関する素晴らしいことは、誰かにこの問題について話すときに、しばしば別の角度から見始めることです。問題は、このネストされた複合型のインスタンスが必要だということでした。 CellValueChangedイベントは私にタイプを与えて、それからインスタンスを作成するだけです。

private void propertyGridControl1_CellValueChanged(object sender, CellValueChangedEventArgs e) 
    { 
     var changedObject = e.Value; 
     if (changedObject != null) 
     { 
      if (changedObject.GetType().IsArray || changedObject.GetType().IsGenericList()) 
      { 
       var collectionItems = changedObject as IEnumerable; 
       if (collectionItems != null) 
        foreach (var item in collectionItems) 
        { 
         SetValueOfCollectionComplexObject(item); 
        } 
      } 
     } 
    } 


public void SetValueOfCollectionComplexObject(object item) 
{ 
     var complexProps = item.GetType().GetProperties().Where(x => !x.PropertyType.IsSimpleType()); 
     foreach (var prop in complexProps) 
     { 
      if (prop.GetValue(item) == null) 
      { 
       prop.SetValue(item, Activator.CreateInstance(prop.PropertyType)); 
       SetValueOfCollectionComplexObject(prop.GetValue(item)); 
      } 
     } 
    } 
関連する問題