Ответ заключается в использовании отражения. Представьте, что вы реализовали ICountry следующим образом:
interface ICountry
{
string GetCountryInfo();
}
И вы создали другой тип объекта Country как:
class CountryB : ICountry
{
public CountryB(string name, int population)
{
}
public string GetCountryInfo()
{
return "This is countryB";
}
}
. Вы можете использовать отражение, чтобы получить ссылку на конструктор для обоих (включая Первоначальная страна) из этих объектов и ссылаться на нее. Вызов его даст вам новый экземпляр этого объекта.
Предполагая, что вы находитесь в консольном приложении, будет работать следующее; Вы можете настроить это по мере необходимости:
var countryTypes = typeof(Program).Assembly.GetTypes()
.Where(t => t.GetInterface("ICountry") != null).ToList();
countryTypes.ForEach(t => Console.WriteLine(t.Name));
var countries = countryTypes
.Select(t => t.GetConstructor(new[]{typeof(string), typeof(int)}))
.Select(t => t.Invoke(new Object []{ "help me", 911}) as dynamic)
.ToList();
countries.ForEach(t=> Console.WriteLine(t.GetCountryInfo()));
Вы можете увидеть рабочую версию в этом do tnet fiddle: https://dotnetfiddle.net/DGYJBM
-Isaa c