Ссылка на отсутствующий объект в переопределенном списке с использованием расширенных элементов - PullRequest
0 голосов
/ 04 апреля 2011

Он всех,

Я пытаюсь настроить класс управления проектом. Чтобы увидеть, изменилось ли что-то в данных, я хочу реализовать события на более низком уровне структуры программирования. У меня есть несколько классов, расширяющих класс ProjectComponent. В базовом классе есть метод события и его выбрасывания, который могут использовать дочерние компоненты. Теперь у меня есть несколько пользовательских списков (nameley eList) в объекте проекта. Поскольку все дочерние компоненты имеют общего родителя ProjectComponent, я бы хотел, чтобы мой объект настраиваемого списка (eList) подписывался на событие при добавлении объекта и отменял подписку при удалении.

Однако при попытке проги это я получил следующую ошибку:

'ProjectComponent' не содержит определение для itemChanged и нет метод расширения itemChanged принимая первый аргумент типа 'ProjectComponent'

Что является странным видением, поскольку класс явно имеет это открытое поле.

Вот код:

public class ProjectComponent
{
    public event ItemChanged itemChanged;

    public void throwItemChangedEvent(ItemChangedEventArgs Arguments)
    {
        if (itemChanged != null)
            itemChanged(new Object(), Arguments);
    }
}

public class eList<ProjectComponent> : IList<ProjectComponent>
{
    List<ProjectComponent> internalList = new List<ProjectComponent>();
    public override void Add(ProjectComponent Item)
    {
        this.internalList.Add(Item);
        Item.itemChanged += new ItemChanged(ItemChanged_Handler);
    }

    private void ItemChanged_Handler(object sender, ItemChangedEventArgs eventArgs)
    {
        //do stuff here
    }
}

Пример того, как это будет называться:

public eList<ChildClass> Children = new eList<ChildClass>();

Идея состоит в том, что когда объект в списке редактируется, объект списка получает объект следующим образом:

Children.childstring = "anything";

В настоящее время поле внутри объекта Children изменяется, и событие может быть получено.

У меня просто вопрос, что я делаю неправильно, почему я не могу добавить событие ProjectComponent в класс eList? Или кто-нибудь знает лучший способ добиться таких же результатов?

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

Harry

Редактировать: определение ItemChanged delagate:

public delegate void ItemChanged(object sender, ItemChangedEventArgs eventArgs);
public class ItemChangedEventArgs : EventArgs
{
    private String p_CallStack;

    public String CallStack
    {
        get { return this.p_CallStack; }
        set { this.p_CallStack = value; }
    }

    public ItemChangedEventArgs()
    {
        p_CallStack = "";
    }

    public ItemChangedEventArgs(String StackStart)
    {
        p_CallStack = StackStart;
    }
}

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

у вас есть 2 ошибки:

1

в обобщенном классе определение, вы должны использовать переменные, а не существующие классы:

public class eList<ProjectComponent>: ...

-> public class eList<T>: ...

в вашем случае вы хотите сделать:

public class eList : IList<ProjectComponent>

2

Item.itemChanged += new Item.itemChanged(ItemChanged_Handler);

new Item.itemChanged не имеет значения, вы должны использовать базовый тип делегата вашего мероприятия:

Item.itemChanged += new ItemChanged(ItemChanged_Handler);

N.B:

ваш код не соблюдает вообще правила проектирования для c #

Больше информации здесь: Правила именования

0 голосов
/ 04 апреля 2011

Разве это не должно быть

Item.itemChanged += new ItemChanged(ItemChanged_Handler);
...