C#处理事件

时间:2014-11-30 20:29:30

标签: c# events event-handling

我正在尝试制作某种类型的库,我正在努力掌握如何以我想要的方式实现它。 我创建了一个简约的例子来向您展示我想要做的事情。

using System;
namespace example
{
    public class Car
    {
        public int Price;
        public string ModelName;
        public Boolean Sold;
        public delegate void SellEventHandler(string str);
        public static event SellEventHandler _OnSell;

        public void OnSell(string str)
        {
            Console.WriteLine("event was fired");
        }

        public Car(int price, string modelname)
        {
            Price = price;
            ModelName = modelname;
            Sold = false;
            _OnSell = OnSell;
        }
    }

    public class Program
    {
        static void Main()
        {
            Car _car = new Car(6000, "audi");
            _car._OnSell += Car_OnSell;
        }

        public void Car_OnSell(string message)
        {
            Console.WriteLine(message);
        }
    }
}

即使我没有实现,也会调用该事件(应该在Sold的{​​{1}}属性发生变化时调用),我想执行_car类的OnSell(string str)方法(打印“事件被触发”)之后,我想执行Car函数(参见代码Car_OnSell

希望你明白我在这里想做什么。现在,我得到的错误是_car.OnSell += Car_OnSellMember 'example.Car._OnSell' cannot be accessed with an instance reference; qualify it with a type name instead。但是我不确定我是否正朝着正确的方向前进。

1 个答案:

答案 0 :(得分:1)

我想我明白你在做什么,这就是我要做的。

  1. 不要在课堂上挂钩。相反,创建一个“销售”方法,该方法执行类通常所做的任何事情(例如设置Sold == true),但首先检查客户端是否连接了您的_OnSell事件,然后先触发该事件。您可能希望为客户提供某种方式来取消_OnSell活动中的销售。
  2. 您还需要使Car_OnSell静态,因为您正在从静态方法(Main)中将其挂起。这是因为非静态方法需要类实例来访问它。
  3. 以下是一个例子:

    static void Main()
    {
        var car = new Car(6000, "audi");
        car._OnSell += Car_OnSell;
        car.Sell(string.Format("Selling the car: {0}", car.ModelName));
    }
    
    public static void Car_OnSell(string message)
    {
        Console.WriteLine(message);
    }
    
    public class Car
    {
        public int Price { get; set; }
        public string ModelName { get; set; }
        public Boolean Sold { get; set; }
        public delegate void SellEventHandler(string str);
        public event SellEventHandler _OnSell;
    
        public void Sell(string str)
        {
            if (_OnSell != null)
            {
                _OnSell(str);
            }
    
            this.Sold = true;
        }
    
        public Car(int price, string modelname)
        {
            Price = price;
            ModelName = modelname;
            Sold = false;
        }
    }