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

本文关键字:数据 表示 GUI | 更新日期: 2023-09-27 18:00:36

我正在尝试制作一个小型应用程序,可以编辑早期项目中的数据文件。我可以访问那些可以读/写文件的项目"数据类"(非常愚蠢的类,其主要目的是公开它的(公共)成员变量)。我所要做的就是制作一个GUI,它可以编辑每个数据类所具有的不同成员变量(最好不修改数据类),我正在努力找出如何做到这一点,这样就可以很容易地适应未来的更改/添加。(我觉得我不能假设所有成员变量都是可编辑的,可能只是其中的一部分)。

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

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

让我担心这个解决方案的是,我觉得这应该是一个有点常见的问题,当谈到OO时,我有点生疏,这个解决方案闻起来像是如果我必须在C.中做的话我会写的东西

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

这种做法看起来明智吗?

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

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

反射算法可以设计为处理给定的任何对象结构,并且与基于静态类型的算法不同,它不必在编译时知道这些结构。不利的一面?它很慢,而且对算法的编译时检查很少,所以它可能会在运行时以意想不到的方式失败。

这里有一些东西可以让你开始:

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

为了处理可编辑性,您需要某种记录,说明用户有权更改哪些内容,以及他们没有权限更改哪些内容。如果这些信息永远不会因用户而异,则可以使用属性将这些信息合并到数据类本身中(这不会改变对象的"接口";它仍然具有所有相同的成员,但这些成员将具有额外的元数据)。您还可以创建另一组类来实现一个接口,该接口将每个类定义为其父类的一组"字段权限",然后您可以动态构建"字段权限"类的实例,该实例具有表示对象定义的Type实例,并了解字段权限对象实现的接口的名称。