【问题标题】:Get type of a class and instantiate another instance of it获取类的类型并实例化它的另一个实例
【发布时间】:2011-01-05 09:08:28
【问题描述】:

问题

我有一个基类 Number,它被 OneTwoThree 类继承。

我有财产

public Number SomeNumber{get;set;}

最初,我将SomeNumber 设置为OneTwoThree(随机生成的值)。

稍后,我想将SomeNumber 设置为与旧类相同类型的新类。这可能吗?如果有,怎么做?

示例:

初始化时,SomeNumber 设置为 One

稍后在程序中,我想将SomeNumber 设置为One 的新实例。

【问题讨论】:

    标签: c# .net c#-4.0


    【解决方案1】:

    我会在 Number 上添加一个抽象方法 CreateInstance 并在其所有具体子类中实现它。

    abstract class Number
    {
      abstract Number CreateInstance();
    }
    
    class One : Number
    {
      override Number CreateInstance()
      {
        return new One();
      }
    }
    

    “稍后”

    Number newNumber = SomeNumber.CreateInstance();
    

    它不需要反射,因此是类型安全的,如果构造函数需要一些参数,它会支持参数。

    【讨论】:

    • 从未想过使用抽象类。非常感谢!
    • 数字必须是抽象类才能拥有抽象成员
    • 可以让它只是虚拟的。这个概念不依赖于此。这取决于您是否需要只是 Number 的实例,或者它们是否实际上不存在。
    【解决方案2】:
    SomeNumber = (Number)Activator.CreateInstance(SomeNumber.GetType());
    

    对于参数,您必须将参数打包成这样:

    public partial class Form1 : Form
    {
        public Number SomeNumber { get; set; }
        public Form1()
        {
            InitializeComponent();
    
            SomeNumber = new One();
    
            SomeNumber = (Number)Activator.CreateInstance(SomeNumber.GetType(), new[] {1});
        }
    
    }
    
    public class Number
    {
    
    }
    
    public class One : Number
    {
        public One()
        {
    
        }
        public One(Object a)
        {
    
        }
    
    }
    

    Stefan 的上述帖子是实现它的更好方法。 另一种选择是创建一个对象工厂

    【讨论】:

    • 类(Number)有带参数的构造函数怎么办
    猜你喜欢
    • 2021-11-19
    • 2023-03-28
    • 1970-01-01
    • 2016-11-16
    • 2013-03-18
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多