【发布时间】:2014-02-09 09:40:23
【问题描述】:
所以我试图创建自己的事件来初始化一个名为 Car 的类,该类继承自汽车对象。以下是 C# 代码中的相同内容:
`
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Abc.Training.Artifacts;
namespace Abc.Training.Objects
{
public abstract class Automobile
{
public string Model { get; set; }
public string Manufacturer { get; set; }
public string YoM { get; set; }
}
public class Car : Automobile
{
public static event Delegates.ObjectInitHandler OnInit;
public string MarketSegment { get; set; }
public int BootSpace { get; set; }
public Car(string model, string manufacturer, string yom)
{
Model = model ;
Manufacturer = manufacturer;
YoM = yom;
ObjectInitEventArgs eArgs = new ObjectInitEventArgs();
eArgs.IsResidentObject = true;
eArgs.ObjectType = this.GetType();
if (OnInit != null) OnInit(this, eArgs);
}
}
}
`
ObjectInitHandler 及其参数(这里使用的委托类型)也是由我创建的:
`
public delegate void ObjectInitHandler(object sender, ObjectInitEventArgs e);
public class ObjectInitEventArgs:EventArgs
{
public Type ObjectType { get; set; }
public bool IsResidentObject { get; set; }
}
`
我正在订阅以下活动:
`
Car.OnInit += new Delegates.ObjectInitHandler(Car_OnInit);//able to do this as event is static
Car c = new Car("Maruti", "Maruti", "2004");
void Car_OnInit(object sender, ObjectInitEventArgs e)
{
Console.WriteLine("Car object initialized");
}
`
我想为这个类创建一个事件 OnInit。但是,如果我在发布者(我的 Car 类)中放置一个实例事件 OnInit,我必须先初始化该类,然后才能订阅此事件。因为我想在初始化时触发这个事件,所以这对我来说是一个先有鸡还是先有蛋的问题。
我通过创建一个静态事件对象并在对象初始化之前进行订阅来解决它,如下所示(这是来自上面代码本身的sn-p):
public static event Delegates.ObjectInitHandler OnInit;
但是,在 ASP.NET 应用程序中,这意味着如果多个用户访问此应用程序,我将拥有相同的委托对象,该对象将具有重复的事件订阅(因为它是静态的),这显然不是很酷。
是否有我可以遵循的设计模式将事件也作为实例成员,但我仍然可以在实例化之前订阅事件?
【问题讨论】:
标签: c# asp.net .net c#-4.0 c#-3.0