我有一个程序,其中上传了包含各种对象的DLL。上传后,我会创建每种类型的实例并将其保存到Treeview中(这些对象内部可能包含其他对象)。 该程序的目的是编辑这些对象,因此我有一个propertyGrid,它允许我在Treeview中编辑选定的对象。 这几乎适用于几乎所有对象。我只是在编辑具有类型为xObjectType列表的属性的对象时遇到问题,并且此xObjectType具有yObjectType作为属性: 例如,这些类在DLL中定义,我必须编辑FunctionCommand,但是当我在propertyGrid中选择属性Function时,会弹出一个CollectionEditor,当内部属性的类型为int,string,byte []时,此Collection Editor可以正常工作等等。但是我无法编辑更复杂的对象的属性。在这种情况下,RFunction属性将被禁用。
public partial class FunctionCommand
{
/// <summary> Number of functions sent as part of the command</summary>
public uint TotalNoOfFunctions { get; set; }
/// <summary> Message structure for the function definition. Cloud shall always set this.</summary>
public List<Function> Function { get; set; }
}
public partial class Function
{
public enum StoragePriorityENUM
{
LOW = 0,
HIGH = 1,
}
/// <summary> Function id to uniquely identify a function</summary>
public string FunctionId { get; set; }
/// <summary> Set this ONLY for R function</summary>
public RFunction RFunction { get; set; }
}
public partial class RFunction
{
/// <summary> Diagnostics data for R function</summary>
public DIAGData DiagData { get; set; }
/// <summary>shall start the diagnostic process with a delay(minutes)</summary>
public uint DelayTimeToStart { get; set; }
}
我可以在CollectionEditor外部正确编辑这些类型的对象,但不能在其内部正确编辑。 为什么此特定属性不可编辑,为什么要在CollectionEditor中编辑复杂对象?
编辑: 这是我在Treeview中创建实例的方式,这包括在必要时创建List <>的实例,“ types”变量是一个包含DLL中所有类型的列表:
private TreeNode GetSubTypes(Type subType, ref TreeNode rootObj, List<TreeNode> treenodeObj)
{
foreach (PropertyInfo prop in subType.GetProperties())
{
Type subtemp = null;
Type[] temp = prop.PropertyType.GenericTypeArguments;
if (temp.Length> 0)
{
subtemp = temp[0];
}
var childObj = new TreeNode();
if (types.Contains(prop.PropertyType) || subtemp!=null)
{
childObj.Text = prop.Name;
childObj.Tag = Activator.CreateInstance(prop.PropertyType);
if (subtemp != null)
{
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(subtemp);
prop.SetValue(rootObj.Tag, Activator.CreateInstance(constructedListType));
}
}
else
{
childObj.Text = prop.Name;
childObj.Tag = "";
}
GetSubTypes(prop.PropertyType, ref childObj, treenodeObj);
if(childObj.Text!="") rootObj.Nodes.Add(childObj);
if (!usedTypes.Contains(prop.PropertyType.Name))
usedTypes.Add(prop.PropertyType.Name);
treenodeObj.RemoveAll(x => x.Text == prop.PropertyType.Name);
treenodeObj.RemoveAll(x => x.Text == "");
}
return null;
}