C# 如何为GUI生成表示(类)数据?

C# 如何为GUI生成表示(类)数据?,c#,C#,我正在尝试制作一个小应用程序,可以编辑早期项目中的数据文件。我可以访问那些可以读/写文件的项目“数据类”(相当愚蠢的类,其主要目的是公开它的(公共)成员变量)。我所要做的就是制作一个GUI,它可以编辑每个数据类所拥有的不同成员变量(最好不修改数据类),我正在试图弄清楚如何做到这一点,以便它能够轻松地适应未来的更改/添加。 (我觉得我不能假设所有成员变量都应该是可编辑的,可能只是其中的一部分) 所有的数据都可以转换成字符串(数字和文本),我认为在GUI中生成文本框和/或类似DataGridView

我正在尝试制作一个小应用程序,可以编辑早期项目中的数据文件。我可以访问那些可以读/写文件的项目“数据类”(相当愚蠢的类,其主要目的是公开它的(公共)成员变量)。我所要做的就是制作一个GUI,它可以编辑每个数据类所拥有的不同成员变量(最好不修改数据类),我正在试图弄清楚如何做到这一点,以便它能够轻松地适应未来的更改/添加。 (我觉得我不能假设所有成员变量都应该是可编辑的,可能只是其中的一部分)

所有的数据都可以转换成字符串(数字和文本),我认为在GUI中生成文本框和/或类似DataGridView的东西没有什么问题,但我不确定如何表示生成这些数据所需的数据

我的第一个想法是为每个数据类使用一个包含所有变量的列表。列表中的每一行都包含变量的名称+描述(对于GUI),一个指向数据类中变量的指针,可能还有针对不同变量的某种形式的验证函数。 将该列表存储在继承原始数据类(并为任何特定GUI相关函数(加载/保存等)实现接口/抽象类)的类中

让我担心这个解决方案的是,我觉得这应该是一个比较常见的问题,当涉及到OO时,我有点生疏了,这个解决方案闻起来像是我必须用C写的东西

甚至可能有一个方便的语言结构、设计模式或适合的东西,但我不知道要搜索什么


这种方法似乎合理吗?

在这种情况下,反射是你的朋友。您的数据类有一个结构,可以使用该类的
类型
进行探索。
类型
是与类或结构相关的元数据的基类,包括用于获取属于该类的所有字段、属性和/或方法列表的方法。然后,表示这些类“成员”的对象可以用于设置或获取字段或属性值,或者调用方法,给定该类型对象的实例

反射算法可以设计为处理给定的任何对象结构,并且与基于静态类型的算法不同,它不必在编译时知道这些结构。缺点是什么?它的速度很慢,而且对算法的编译时检查很少,因此它可能在运行时以意外的方式失败

以下是一些让您开始学习的内容:

//statically set up an instance of some arbitrary object
MyClass myObject = new MyClass();
myObject.Field1 = "Hello";
myObject.Field2 = "World";

//This method is available on any object, and produces a Type representing the class definition
Type myType = myObject.GetType();

//C# also has a typeof() keyword that works when you have a static type and not an instance
myType = typeof(MyObject);

//Interrogate the Type instance to get its fields
FieldInfo[] fields = myType.GetFields();

//then, iterate through the fields to perform some (useful?) work.
//Here, we are outputting a list of paired field names and their current values.
//You will probably want to instantiate a Label and Textbox representing this value 
//and show them on a Form.
foreach(FieldInfo field in fields)
   Console.WriteLine(String.Format("{0}: {1}", field.Name, field.GetValue(myObject));
要处理可编辑性,您需要某种类型的记录,记录用户有权更改什么,没有权限更改什么。如果该信息永远不会在用户之间更改,则可以使用属性将该信息合并到数据类本身中(这不会更改对象的“接口”;它仍然具有所有相同的成员,但这些成员将具有额外的元数据)。您还可以创建另一组类,这些类实现一个接口,将每个类定义为其父类的一组“字段权限”,然后您可以使用表示对象定义的类型实例动态构造“字段权限”类的实例,以及字段权限对象实现的接口名称的知识