C# 向用户提供配置对象树的最简单方法是什么?
因此,我有一个对象树,它看起来类似于:C# 向用户提供配置对象树的最简单方法是什么?,c#,winforms,user-interface,C#,Winforms,User Interface,因此,我有一个对象树,它看起来类似于: AbstractA string PropA int PropB AbstractC PropC AbstractD PropD AbstractB string PropA string PropB AbstractC : AbstractB string PropC AbstractD : AbstractB int PropC ConcreteA1 : AbstractA
AbstractA
string PropA
int PropB
AbstractC PropC
AbstractD PropD
AbstractB
string PropA
string PropB
AbstractC : AbstractB
string PropC
AbstractD : AbstractB
int PropC
ConcreteA1 : AbstractA
int PropE
ConcreteC1 : AbstractC
bool PropD
ConcreteC2 : AbscractC
decimal PropD
ConcreteD1 : AbstractD
string PropD
ConcreteD2 : AbstractD
long PropD
我面临的问题是找到一种全面的方法,为用户提供配置对象树的能力。有多个具体类扩展了我的摘要,我不想为每个具体类型构建用户控件。为了在混合中抛出一个附加约束,类定义来自我的WCF代理类。如果可能的话,我希望避免滚动我自己的代理/模型定义,但是如果实现我的目标的唯一方法是这样做,那就这样吧
我最初尝试使用PropertyGrid,但我对它的了解非常薄弱,昨晚我在谷歌上搜索任何好的示例时运气都不太好。为了避免为每种类型构建控件,需要对每个对象的属性使用反射,并将数据转换为易于操作的字符串。具有两列的网格控件,左侧为属性名称,右侧为属性值(作为字符串)。进行编辑时,将值转换为正确的类型。每个基类型都有一个相对容易访问的继承转换器 grid/listview需要是属性列表,这些属性需要映射到类实例。对象列表将表示项目(具体对象)的每个属性。对象列表将需要记住一些东西,项目、属性的属性信息和值,以及您希望网格根据属性信息执行的任何其他操作
使用Reflection和TypeConverter,您可以获取每个属性并编辑它们的值,从而创建一个控件(类实例属性的网格/列表视图)来编辑任何类。为了避免为每个类型生成控件,您需要对每个对象的属性使用反射,并将数据转换为易于操作的字符串。具有两列的网格控件,左侧为属性名称,右侧为属性值(作为字符串)。进行编辑时,将值转换为正确的类型。每个基类型都有一个相对容易访问的继承转换器 grid/listview需要是属性列表,这些属性需要映射到类实例。对象列表将表示项目(具体对象)的每个属性。对象列表将需要记住一些东西,项目、属性的属性信息和值,以及您希望网格根据属性信息执行的任何其他操作
使用Reflection和TypeConverter,您可以获取每个属性并编辑它们的值,从而创建一个控件(类实例的属性的网格/列表视图)来编辑您的任何类。听起来您在交互的双方都使用.net,并且可以控制双方。如果是这种情况,则不生成代理类,您可以将契约放入服务和客户端都引用的公共程序集中,直接使用契约类和接口,而不是使用生成的代理,从而可以完全控制所使用的类,并能够使用您想要的任何属性。听起来像是在使用.net对双方都有互动和控制。如果是这种情况,则不生成代理类,您可以将契约放入服务和客户端都引用的公共程序集中,直接使用契约类和接口,而不是使用生成的代理,从而完全控制所使用的类,并能够使用您想要的任何属性。这不是PropertyGrid控件吗你正在那里重建?可能是的,我从未使用过PropertyGrid控件。我已经在尝试使用PropertyGrid控件,遇到的问题是我的对象是从WCF元数据生成的。向属性添加属性不起作用。这不是您正在重建的PropertyGrid控件吗?可能是,我从未使用过PropertyGrid控件。我正在尝试使用PropertyGrid控件,遇到的问题是我的对象是从WCF元数据生成的。向属性添加属性不起作用。出于某种奇怪的原因,我没有意识到这是可能的。我想我仍然生活在网络服务时代。。。我会试一试的。我更喜欢这样做wcf。使用channelfactory轻松创建代理实例。这样,如果合同发生更改,您就不需要一直重新生成代理以保持代理同步。实现所有属性描述符和自定义类型描述符需要做大量工作,但还不如为每个具体类型创建单独的控件。现在我只需要弄清楚如何让我的char[]集合编辑器接受\t。。。洛莉没有意识到这是可能的,因为某种奇怪的原因。我想我仍然生活在网络服务时代。。。我会试一试的。我更喜欢这样做wcf。使用channelfactory轻松创建代理实例。这样,如果合同发生更改,您就不需要一直重新生成代理以保持代理同步。实现所有属性描述符和自定义类型描述符需要做大量工作,但还不如为每个具体类型创建单独的控件。现在我只需要弄清楚如何让我的char[]集合编辑器接受\t。。。英雄联盟