我正在尝试创建一个可以编辑早期项目中的数据文件的小应用程序。我可以访问那些可以读/写文件的项目“数据类”(非常愚蠢的类,其主要目的是公开它的(公共)成员变量)。我所要做的就是创建一个GUI,可以编辑每个数据类所拥有的不同成员变量(最好不要修改数据类),我试图找出如何做到这一点,以便它很容易适应未来的变化/补充。 (我不觉得我可以假设所有成员变量都应该是可编辑的,可能只是选择它们。)
所有数据都可以转换为字符串(数字和文本),我没有看到在GUI中生成文本框和/或类似DataGridView的问题,但我不确定如何想表示生成这些数据所需的数据。
我的第一个想法是使用包含每个数据类的所有变量的列表。列表中的每一行都包含变量的名称+描述(对于GUI),指向数据类中的变量的指针,以及可能为不同变量的某种形式的验证函数。 将该列表存储在继承原始数据类的类中(并为任何特定的GUI相关函数(加载/保存等)实现接口/抽象类)。
让我担心这个解决方案的事情就是我觉得这应该是一个常见的问题而且我对OO有点生疏,这个解决方案闻起来像我写的东西,如果我有的话在C中做。
甚至可能有一个方便的语言结构,设计模式或适合的东西,但我不知道要搜索什么。
这种做法是否合情合理?
答案 0 :(得分:0)
在这种情况下,反射是你的朋友。您的数据类具有可以使用该类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实例动态构造“字段权限”类的实例定义,以及字段权限对象实现的接口名称的知识。