Как динамически создавать коллекции производных объектов? - PullRequest
2 голосов
/ 06 декабря 2011

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

// Base class
interface IAnimal {};
public abstract class Animal : IAnimal{}

// Derived classes
interface IDog {}
public class Dog : Animal, IDog { }
interface ICat { }
public class Cat : Animal, ICat { }
interface ITiger { }
public class Tiger : Animal, ITiger { }
interface ILion { }
public class Lion : Animal, ILion { }

// Collection Classes
interface IPets { }
public class Pets
{
    IDog dog = new Dog();
    ICat cat = new Cat();
}
interface ICircus { }
public class Circus
{
    ITiger tiger = new Tiger();
    ILion lion = new Lion();
}

Я хотел бы создать коллекции во время выполнения в универсальном классе Event, читая в списке животных из xml, которые составляют коллекцию.Как правильно сделать это?

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

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Это своего рода ответ на мой собственный вопрос.Возможно, это поможет другим.

Я выбрал очень общий пример, чтобы проиллюстрировать мою ситуацию, потому что я использую это во многих местах в Windows Forms, XNA и Silverlight, которые все очень разные.

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

Еще одна проблема, которую я обнаружил, заключалась в том, что Activator предполагает наличие конструктора без параметров.В моем тестовом примере все мои производные классы - это игровые компоненты XNA с параметром типа Game.

Необходимо выполнить некоторый рефакторинг, чтобы проверить интерфейсы и способы взаимодействия игровых объектов.

Вернусь к этому списку, когда у меня будет что-то еще.

0 голосов
/ 06 декабря 2011

Этот пример помогает?(Это из моего кода, который мне пригодился.) Ключевым моментом здесь является использование отражения в Activator.CreateInstance(...).

public static List<dynamic> LoadChildEntities(XElement entityElt)
{
    var children = new List<dynamic>();

    foreach(XElement childElt in entityElt.Elements("entity"))
    {
        // Look up the C# type of the child entity.
        string childTypename = "MyNamespace." + Convert.ToString(childElt.Attribute("type").Value);
        Type childType = Type.GetType(childTypename);

        if(childType != null)
        {
            // Construct the child entity and add it to the list.
            children.Add(Activator.CreateInstance(childType, childElt));
        }
        else
        {
            throw new InvalidOperationException("No such class: " + childTypename);
        }
    }

    return children;
}

. Если вы хотите вместо списка IAnimal, этоне слишком сложно изменить.

...