В течение долгого времени я пытался найти способ динамически создавать экземпляры всех классов, которые расширяют определенный базовый класс (во время выполнения). Из того, что я прочитал, это должно быть сделано с помощью Reflection
, к сожалению, я еще не понял, как это сделать.
Структура моего проекта выглядит следующим образом:
Library
--|
|
--Vehicle.cs (abstract class)
|
--Car.cs (extending vehicle)
|
--Bike.cs (extending vehicle)
|
--Scooter.cs (extending vehicle)
|
--InstanceService.cs (static class)
|
|
ConsoleApplication
--|
|
--Program.cs
Класс InstanceService содержит универсальный метод, который должен возвращать IEnumerable<T>
, содержащий экземпляры классов, расширяющие Vehicle
, что означает Car, Bike & Scooter
.
Код, приведенный ниже, является текущим состоянием класса InstanceService , после того, как испробовал множество различных решений, то есть он в основном содержит инструменты для отладки.
InstanceService.cs
using System;
using System.Collections.Generic;
namespace Library
{
public static class InstanceService<T>
{
//returns instances of all classes of type T
public static IEnumerable<T> GetInstances()
{
var interfaceType = typeof(T);
List<T> list = new List<T>();
Console.WriteLine("Interface type: " + interfaceType.ToString());
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach(var assembly in assemblies)
{
Console.WriteLine("Assembly: " + assembly.ToString());
if (assembly.GetType().IsAbstract)
{
var instance = (T) Activator.CreateInstance(assembly.GetType());
list.Add(instance);
}
}
return list;
}
}
}
Я также приложил код для абстрактного класса Vehicle
и одну из его реализаций.
Vehicle.cs
namespace Library
{
public abstract class Vehicle
{
protected float maxSpeedInKmPerHour;
protected float weightInKg;
protected float priceInDkk;
}
}
Car.cs
namespace Library
{
public class Car : Vehicle
{
public Car()
{
this.maxSpeedInKmPerHour = 1200;
this.weightInKg = 45000;
this.priceInDkk = 71000000;
}
}
}