Brian J Hoskins Ответов: 2

Создание списка объектов из производных классов во время выполнения


ФОН

У меня есть класс под названием "Tests. cs", который содержит абстрактный базовый класс под названием" Test", а затем у меня есть еще куча написанных классов, которые все являются производными от Test.

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

СОВЕТ

Очевидный способ сделать это-жестко закодировать один экземпляр каждого тестового класса и добавить его в главный список, чтобы во время выполнения я мог сгенерировать таблицу из этого списка, из которой пользователь затем может выбрать свой собственный список тестовых объектов, которые он сохранит на диске.

Это приемлемое решение (оно работает), но я ожидаю, что новые тестовые классы будут разработаны в течение срока службы продукта, и для того, чтобы это новое программное обеспечение было доступно для использования в программе, мне придется каждый раз не забывать добавлять его экземпляр в основной список.
Мне интересно, есть ли какой-то способ генерировать список производных тестовых классов во время выполнения, который не зависит от жестко закодированного списка экземпляров класса.

Что я уже пробовал:

Я попытался создать мастер-список, содержащий по одному экземпляру каждого тестового класса, который считывается во время выполнения. Это работает, но я хотел бы понять, есть ли лучшие способы сделать это.

F-ES Sitecore

Возможно, вам придется объяснить, что вы пытаетесь сделать немного лучше. ОО, дженерики и, возможно, рефлексия, вероятно, могут достичь того, что вы хотите сделать, но я действительно не понимаю, что это такое.

Brian J Hoskins

Большое спасибо за ответ F-ES Sitecore. Я попытался улучшить свой вопрос. Я изучу дженерики и рефлексию, чтобы увидеть, дает ли кто-либо из них мне другие идеи о том, как решить эту проблему.

F-ES Sitecore

Смотрите мое решение.

Brian J Hoskins

Это идеальное решение, и именно то, что я имел в виду.

но... где я могу узнать больше о технике, которую вы использовали здесь?

F-ES Sitecore

Трудно ответить на этот вопрос, вы просто подбираете вещи здесь и там на самом деле. Единственный сложный бит-это загрузка сборок, итерация типов, их создание и т. д., И, как я уже намекал, это называется "отражение", поэтому, если вы загуглите "отражение c#", вы узнаете, как обнаруживать и манипулировать типами во время выполнения (вы можете узнать, какие свойства и методы у чего-то есть, вы можете вызывать методы и т. д. Остальное - это просто базовые принципы ОО о базовых классах и производных классах.

2 Ответов

Рейтинг:
19

F-ES Sitecore

Занятия;

public abstract class BaseTest
{
    public abstract string SaySomething();
}

public class Test1 : BaseTest
{
    public override string SaySomething()
    {
        return "Hello from Test1";
    }
}

public class Test2 : BaseTest
{
    public override string SaySomething()
    {
        return "Hello from Test2";
    }
}
    
public class Test3 : BaseTest
{
    public override string SaySomething()
    {
        return "Hello from Test3";
    }
}


Код;

List<BaseTest> myClasses = new List<BaseTest>();

var myTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => t.IsSubclassOf(typeof(BaseTest)));

foreach (Type t in myTypes)
{
    myClasses.Add((BaseTest)Activator.CreateInstance(t));
}

foreach (BaseTest bt in myClasses)
{
    Console.WriteLine("Type is " + bt.GetType().FullName);
    Console.WriteLine(bt.SaySomething());
}


Выход

Type is ConsoleApplication1.Test1
Hello from Test1
Type is ConsoleApplication1.Test2
Hello from Test2
Type is ConsoleApplication1.Test3
Hello from Test3


Maciej Los

5ед!

BillWoodruff

+5 !