2016-04-06 7 views
0

Hallo Ich möchte eine erweiterbare Sammlung von komplexen Typen, die in anderen komplexen Typ sind. Wie ich dies tun will:Expendable komplexe Typen innerhalb komplexer Typen in jeder Sammlung (Raster der Eigenschaft)

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))); 
    } 

und dann

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

Testmodell:

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; } 
} 

Es funktioniert für Arten in Ordnung, aber nicht für die Sammlung von Typen.

Antwort

0

Das Großartige an der Programmierung ist, wenn Sie jemandem von dem Problem erzählen, fangen Sie oft an, es aus einem anderen Blickwinkel zu betrachten. Das Problem war, dass ich eine Instanz dieses verschachtelten komplexen Typs brauche. CellValueChanged-Ereignis gibt mir Typ und dann muss ich nur eine Instanz davon erstellen.

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)); 
      } 
     } 
    } 
Verwandte Themen