Es gibt keine einheitliche Möglichkeit, dynamische Eigenschaften abzufragen, im Allgemeinen wird erwartet, dass Sie diese im Voraus kennen. Mit DynamicObject
können Implementierer GetMemberNames
überschreiben und das gibt Ihnen im Allgemeinen die Eigenschaften, jedoch ist es wirklich für das Debuggen bestimmt, da es keine Anforderung gibt, dass es alle Eigenschaften bereitstellt. Ansonsten, wenn es Ihre eigene DynamicObject
ist, müssen Sie nur Ihre eigene Methode schreiben, um die Eigenschaften basierend auf Ihrer dynamischen Implementierung zu erhalten. Mit ExpandoObject
können Sie beispielsweise alle Eigenschaften mit der Schnittstelle IDictionary
abfragen.
Sobald Sie also eine Möglichkeit haben, Ihre Eigenschaften zu erhalten, müssen Sie das DataGrid informieren. Leider mit einem Datagrid, das Problem mit ICustomTypeDescriptor
Durchführung dem Datagrid über Ihre Eigenschaften zu sagen ist, dass Datagrid den TypeDescriptors mit der Art nicht die Instanz bekommt, was ein Problem für dynamische Objekte ist jedoch ITypedList
über die Sammlung von DynamicObjects Umsetzung mit der funktioniert Wenn Sie das nicht-generische Interface IList
in Ihrer Sammlung nicht implementieren, wird es entfernt, bevor es an den Punkt gelangt, wo es nach ITypeList
sucht.
Also zusammenfassend, implementieren Sie eine Sammlung mit ITypedList
und IList
. Mit ITypedList
geben Sie null für GetListName
zurück und implementieren Sie einfach GetItemProperties(PropertyDescriptor[] listAccessors)
; Ignoriere listAccessors
und gebe eine PropertyDescriptorCollection von PropertyDescriptors für jedes Element zurück, das auf der Grundlage der am besten dargestellten dynamischen Objektinstanz in der Liste benannt wurde (höchstwahrscheinlich nur das erste Objekt). Sie haben eine Unterklasse von PropertyDescriptor, ein einfacher und allgemeiner Weg zum Get/Set-Wert zu implementieren, ist den Open-Source-Framework verwendet Dynamitey
using System;
using System.ComponentModel;
using Dynamitey;
public class DynamicPropertyDescriptor:PropertyDescriptor
{
public DynamicPropertyDescriptor(string name) : base(name, null)
{
}
public override bool CanResetValue(object component)
{
return false;
}
public override object GetValue(object component)
{
return Dynamic.InvokeGet(component, Name);
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
Dynamic.InvokeSet(component, Name, value);
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override Type ComponentType
{
get { return typeof(object); }
}
public override bool IsReadOnly
{
get { return false; }
}
public override Type PropertyType
{
get
{
return typeof (object);
}
}
}
das funktioniert auch in winforms. Vielen Dank! – swe