Как динамически создать экземпляр класса и метод? - PullRequest
0 голосов
/ 26 апреля 2020

Я создал следующий класс

    class Country
    {

        public string Name { get; set; }
        public int Population { get; set; }

        public Country (string name, int population)
        {
            Name = name;
            Population = population;

        }

        public string GetCountryInfo()
        {
            return "Country" + Name + " has the population of: " + Population + ".";
        }
    }

Я хотел бы динамически создать экземпляр этого класса и вызвать метод (и снова динамически). Как я могу это сделать?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Ответ заключается в использовании отражения. Представьте, что вы реализовали 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

0 голосов
/ 26 апреля 2020

Надеюсь, я правильно получаю ваш запрос.

Что вы можете сделать, это извлечь интерфейс ICountry. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. * здесь?

Этот интерфейс может быть реализован многими другими классами. Однако вы можете объявить одну переменную и в зависимости от ситуации вызвать конструктор другого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...