仅 C# 动态类名 --> 在运行时生成

Posted

技术标签:

【中文标题】仅 C# 动态类名 --> 在运行时生成【英文标题】:C# Dynamic Class Name Only --> Generated at Run-Time 【发布时间】:2017-04-08 04:58:10 【问题描述】:

这仅用于 OOP 的学习目的。

我有一个希望看起来像这样的继承层次结构:

`    
     -> Fruit->0-n fruits classes
     -> Vegetable -> 0-n vegetable classes
 Food-> Milk -> 0-n milk classes
     -> Grain -> 0-n grain classes
     -> Meat -> 0-n meat classes
`    

基类是Food,所有水果/蔬菜/牛奶/谷物/肉类都是扩展食品。那么fruit类可能有一个Apple,Banana,Lemon等类型的孩子。因此Apple,Banana,Lemon将扩展水果,扩展食物。

现在您可以想象,世界上有很多不同类型的水果/蔬菜/牛奶/谷物/肉类。太多了,无法为每个单独的课程。

我想要完成的是:

    创建一个动态类,其标识的 ClassName 类型将根据用户输入的内容而改变。

功能看起来类似于这样:

public class $ClassName : $Category
//Imagine I can put a variable name right where $ClassName is that holds Banana.  
//I'd then determine $Category simply from the location that the user entered the value Banana.

//I'd now have: 
   public class Banana : Fruit


在这种情况下,我不关心类中方法/变量/属性的任何变化。它们都将保持不变,我只希望 ClassName 更改为适当的名称。

这可能吗?还是我在童话世界?理想情况下,上述方法成功后。如果用户输入其中之一,我希望能够使用 object.getType() 获取 ClassName 并让它返回 Apple、Banana、Lemon 之类的东西。

【问题讨论】:

我觉得你还没有类的概念,Banana是水果的名字,不应该是类。所以它宁愿是一个位于水果类中的名称属性。与水果的类型相同,将是一个属性。想想人。 Person 将是一个类......但他的名字“John”不会。将类视为 thing 而不是 thing 本身的规范。 我个人不会这样做。这是一个练习,看看这种类型的功能是否可行。我正在研究 C# 动态类,并想知道该特定部分是否包含我所要求的内容。 我同意@Jim 的观点,通常在OOD 中,一个类具有一组独特的参数和函数,如果两个对象不应该具有不同的能力,那么它们应该是同一个类。例如,如果我们有一个类Drinks 的名称和函数void drink(),它将涵盖水、牛奶、苏打水等。您可以从用户输入中加载名称,而无需尝试创建派生即时输入。 【参考方案1】:

根据 Jim 的评论,我认为您对课程有错误的想法。理想情况下(取决于域),您希望使用 Name 属性对 Fruit 基类进行建模。 “香蕉”是水果,“苹果”是水果,......等等。

public class Fruit  
    public string Name  get; set; 

如果您真的需要具体化,您可以创建使用 Fruit 作为基类的类。可能是 Berry、Drupe、Legume 等。然后你仍然需要一个 Name 属性来定义水果的具体实例是“Raspberry”、“Blueberry”......

public class Berry : Fruit  
    // berry-specific properties

一旦您对类及其结构以及具体类型和抽象类型之间的区别有了更基本的了解,我建议您查看Factory Method 和Abstract Factory 设计模式。如果您确实需要在运行时确定具体类型,这些描述了您可以使用的技术。

【讨论】:

我并不是说在我的 OP 中这样做是一个好主意,或者如果这是你应该做的。我知道我可以简单地不那么具体并删除我的层次结构中的第 3 层,然后让它简单地从用户那里获取输入并将其直接放入水果/肉类/谷物/牛奶/蔬菜类之一的变量中.我只是问有没有可能。我想这样做的原因是,有些水果可以有额外的属性。例如,有许多不同类型的苹果(Granny Smith、Golden Delicious、Honeycrisp、Red Delicious 等)。 一个书呆子的答案,但在那种情况下,我会专注于组合而不是继承(装饰器模式)。 sourcemaking.com/design_patterns/decorator 并专注于确定是什么使特定类型的苹果成为 GrannySmith 或 HoneyCrisp。甜度 = 9,酸度 = 4,或者你有什么。可能有比为“所有事物”创建新类更好的方法来表示数据但是,您发布的问题是关于在运行时确定/创建具体类型,这可以通过工厂模式来完成。

以上是关于仅 C# 动态类名 --> 在运行时生成的主要内容,如果未能解决你的问题,请参考以下文章

C#高阶-反射

msbuild 中动态生成的 C# 文件的问题

如何在运行时从 nhibernate 映射文件生成实体类

java 反射

反射 socket RPC

当结构仅在运行时已知时,将结构从 c++ 传递到 c#