Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何在构造函数中引发事件?_C#_Events_Eventhandler - Fatal编程技术网

C# 我如何在构造函数中引发事件?

C# 我如何在构造函数中引发事件?,c#,events,eventhandler,C#,Events,Eventhandler,我有一个类,它的子类初始化并声明ObservableCollections。我想在基类中收集child的集合,以便稍后在泛型方法中使用,因此我编写了一个事件处理程序,该事件处理程序在ObservableCollection子类的构造函数中提出,并将该处理程序添加到我的BaseView类中。注意:很多子视图已经存在,我希望在不更改它们的代码的情况下实现它。我的ObservableCollection孩子看起来像这样: public class ObservableCollection<T&g

我有一个类,它的子类初始化并声明ObservableCollections。我想在基类中收集child的集合,以便稍后在泛型方法中使用,因此我编写了一个事件处理程序,该事件处理程序在ObservableCollection子类的构造函数中提出,并将该处理程序添加到我的BaseView类中。注意:很多子视图已经存在,我希望在不更改它们的代码的情况下实现它。我的ObservableCollection孩子看起来像这样:

public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
    public ObservableCollection()
        :base()
    {
        OnConstructorCalled(new ConstructorCalledEventArgs(this));
    } 

    public static event ConstructorCalledEventHandler ConstructorCalled;
    protected static void OnConstructorCalled(ConstructorCalledEventArgs e) => ConstructorCalled?.Invoke(e.Sender, e);
}

public class ConstructorCalledEventArgs : EventArgs
{
    public object Sender;
    public ConstructorCalledEventArgs(object sender)
    {
        Sender = sender;
    }
}

public delegate void ConstructorCalledEventHandler(object sender, ConstructorCalledEventArgs e);
public class ChildView : BaseView<string>
{
    ObservableCollection<int> collection = new ObservableCollection<int>();
    public ChildView()
        : base()
    {
    }
}
公共类ObservableCollection:System.Collections.ObjectModel.ObservableCollection
{
公共可观测集合()
:base()
{
OnConstructor Called(新建Constructor CalledEventArgs(本));
} 
公共静态事件构造函数calledEventHandler构造函数called;
ConstructorCalled(ConstructorCalledEventArgs e)=>ConstructorCalled?Invoke(e.Sender,e)上受保护的静态无效空间;
}
公共类构造函数CalledEventArgs:EventArgs
{
公共对象发送器;
公共构造函数CalledEventArgs(对象发送方)
{
发送方=发送方;
}
}
公共委托void构造函数CalledEventHandler(对象发送方,构造函数CalledEventArgs e);
我的BaseView看起来像这样

    protected ObservableCollection<ObservableCollection<TObject>> ObservableCollectionCollector = new ObservableCollection<ObservableCollection<TObject>>();
    protected BaseView()
    {
        ObservableCollection<TObject>.ConstructorCalled += OnCollectionDeclared;
    }

    private void OnCollectionDeclared(object sender, ConstructorCalledEventArgs e)
    {
        if (sender is ObservableCollection<TObject>)
        {
            ObservableCollectionCollector.Add(sender as ObservableCollection<TObject>);
        }
    }
受保护的ObservaleCollection ObservaleCollectionCollector=新的ObservaleCollection();
受保护的BaseView()
{
ObservableCollection.ConstructorCalled+=OnCollectionDeclared;
}
声明的CollectionPrivate void(对象发送方、构造函数CalledEventArgs e)
{
如果(发送方是可观察的收集)
{
添加(发送方作为ObservableCollection);
}
}
我现在的问题是,事件没有被提出,我不知道为什么

编辑:

我现在选择了一种不同的方法,因为我对泛型类及其事件处理程序有一些问题。我创建了一个新的静态类,它现在处理视图和ObservableCollections的构造函数调用。在我看来,我只希望看到一种类型的ObservableCollection类。现在,我的代码如下所示:

BaseView:

public class BaseView<TObject>
{
    public List<ObservableCollection<int>> ObservableCollectionCollector = new List<ObservableCollection<int>>();
    public BaseView()
    {
        ObservableCollectionCollector = CollectionHandler.GetAndRemoveCollection();
    }
}
公共类基本视图
{
public List observeCollectionCollector=new List();
公共BaseView()
{
ObservableCollectionCollector=CollectionHandler.GetAndRemoveCollection();
}
}
可观察收集:

public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
    public ObservableCollection()
        : base()
    {
        AddToCollectionHandler();
    }
    private void AddToCollectionHandler()
    {
        if (this is ObservableCollection<int>)
        {
            CollectionHandler.AddToCollection(this as ObservableCollection<int>);
        }
    }
}   
公共类ObservableCollection:System.Collections.ObjectModel.ObservableCollection
{
公共可观测集合()
:base()
{
AddToCollectionHandler();
}
私有void AddToCollectionHandler()
{
如果(这是可观察收集)
{
CollectionHandler.AddToCollection(这称为ObservableCollection);
}
}
}   
还有我的收藏家:

static class CollectionHandler
{
    private static List<ObservableCollection<int>> collection = new List<ObservableCollection<int>>();
    public static List<ObservableCollection<int>> GetAndRemoveCollection()
    {
        List<ObservableCollection<int>> col = collection;
        collection = new List<ObservableCollection<int>>();
        return col;
    }
    public static void AddToCollection(ObservableCollection<int> item) => collection.Add(item);
}
静态类CollectionHandler
{
私有静态列表集合=新列表();
公共静态列表GetAndRemoveCollection()
{
列表col=集合;
集合=新列表();
返回列;
}
公共静态void AddToCollection(ObservableCollection项)=>collection.Add(项);
}
顺便说一句,子视图可能如下所示:

public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
    public ObservableCollection()
        :base()
    {
        OnConstructorCalled(new ConstructorCalledEventArgs(this));
    } 

    public static event ConstructorCalledEventHandler ConstructorCalled;
    protected static void OnConstructorCalled(ConstructorCalledEventArgs e) => ConstructorCalled?.Invoke(e.Sender, e);
}

public class ConstructorCalledEventArgs : EventArgs
{
    public object Sender;
    public ConstructorCalledEventArgs(object sender)
    {
        Sender = sender;
    }
}

public delegate void ConstructorCalledEventHandler(object sender, ConstructorCalledEventArgs e);
public class ChildView : BaseView<string>
{
    ObservableCollection<int> collection = new ObservableCollection<int>();
    public ChildView()
        : base()
    {
    }
}
公共类子视图:BaseView
{
ObservableCollection集合=新的ObservableCollection();
公共儿童视图()
:base()
{
}
}

您正在类的字段初始值设定项中创建
ObservableCollectionCollector
实例


字段初始值设定项在类构造函数体之前运行,因此在添加事件处理程序之前运行。您只需要在处理静态事件后创建实例。

您正在类的字段初始值设定项中创建
ObservableCollectionCollector
实例


字段初始值设定项在类构造函数体之前运行,因此在添加事件处理程序之前运行。您只需要在处理静态事件后创建实例。

当您创建对象时,您只需要在其构造函数完成后获得实际实例。
严格来说不是真的。您可以访问构造函数中的对象实例,OP将在其中添加处理程序。当然,即使它仍然在构造函数中,他们添加它仍然太迟了。为什么这应该与静态事件有关?@RandRandom:Oops;我错过了那部分。我真的不明白你的答案,但它闻起来有点可疑。只是不能用手指指着它。为什么初始化
ObservableCollectionCollector
与事件有关,看不出错误@RandRandom事件在初始化时被激发,因为它在其构造函数中激发事件。当它初始化时,它调用构造函数。
当你创建一个对象时,你只会在它的构造函数完成后得到实际的实例。
严格来说不是真的。您可以访问构造函数中的对象实例,OP将在其中添加处理程序。当然,即使它仍然在构造函数中,他们添加它仍然太迟了。为什么这应该与静态事件有关?@RandRandom:Oops;我错过了那部分。我真的不明白你的答案,但它闻起来有点可疑。只是不能用手指指着它。为什么初始化
ObservableCollectionCollector
与事件有关,看不出错误@RandRandom事件在初始化时被激发,因为它在其构造函数中激发事件。初始化时是调用构造函数时。