Получить тип класса и создать экземпляр другого экземпляра - PullRequest
0 голосов
/ 05 января 2011

Вопрос

У меня есть базовый класс Number, который наследуется классами One, Two и Three.

У меня есть свойство

public Number SomeNumber{get;set;}

Изначально я установил SomeNumber на One, Two или Three (значение, сгенерированное случайным образом).

Позже я хочу установить SomeNumber на новыйкласс того же типа старого класса.Это возможно?Если да, как?

Пример:

При инициализации SomeNumber устанавливается на One

Позже в программе я хочу установить SomeNumberна новый экземпляр One.

Ответы [ 2 ]

7 голосов
/ 05 января 2011

Я бы добавил абстрактный метод CreateInstance для Number и реализовал его во всех его конкретных подклассах.

abstract class Number
{
  abstract Number CreateInstance();
}

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

"позже"

Number newNumber = SomeNumber.CreateInstance();

Не требует отражения, поэтому безопасен и будет поддерживать аргументы, если конструкторам понадобятся некоторые.

1 голос
/ 05 января 2011
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)
    {

    }

}

Пост выше Стефана - лучший способ реализовать это. Другим вариантом будет создание фабрики объектов

...