是否有更简洁的方法在C#3和C#4中定义自定义事件?
发布时间:2020-12-16 10:27:28 所属栏目:百科 来源:网络整理
导读:在以下控制台应用程序示例中,事件定义如下: public delegate void PurchaseHandler(object obj,PurchaseArgs args);public event PurchaseHandler OnPurchaseMade; 在看完之后我觉得这可能有点“C#2”. 是否有更简洁的方式来表达C#3和C#4? using System;us
在以下控制台应用程序示例中,事件定义如下:
public delegate void PurchaseHandler(object obj,PurchaseArgs args); public event PurchaseHandler OnPurchaseMade; 在看完之后我觉得这可能有点“C#2”. 是否有更简洁的方式来表达C#3和C#4? using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestEvents288202 { class Program { static void Main(string[] args) { Product product1 = Product.LoadProduct(222); EmailManager.NotifyAdministrator(product1); product1.OnPurchaseMade += new Product.PurchaseHandler(NotifyUser); product1.Purchase(); Product product2 = Product.LoadProduct(333); EmailManager.NotifyAdministrator(product2); product2.OnPurchaseMade += new Product.PurchaseHandler(NotifyUser); product2.Purchase(); Console.ReadLine(); } static void NotifyUser(object sender,PurchaseArgs e) { ((Product)sender).Log(); Console.WriteLine(e.Message); } } public static class EmailManager { public static void NotifyAdministrator(Product product) { product.OnPurchaseMade += new Product.PurchaseHandler(SendEmail); } public static void SendEmail(object sender,PurchaseArgs e) { Product product = sender as Product; Console.WriteLine("Just sent e-mail to administrator notifying of purchase of article {0}",product.ProductNumber); } } public class PurchaseArgs : EventArgs { public string Message { get; set; } public PurchaseArgs(string message) { Message = message; } } public class Product { public int ProductNumber { get; set; } public string Name { get; set; } public string Description { get; set; } public delegate void PurchaseHandler(object obj,PurchaseArgs args); public event PurchaseHandler OnPurchaseMade; public static Product LoadProduct(int productNumber) { List<Product> products = new List<Product>(); products.Add(new Product { ProductNumber = 111,Name = "Intel CPU",Description = "Newest model,very fast." }); products.Add(new Product { ProductNumber = 222,Name = "Philips Monitor",Description = "22-inch,very nice." }); products.Add(new Product { ProductNumber = 333,Name = "Sony Camera",Description = "10 Megapixels,sharp pictures." }); return products.Where(p => p.ProductNumber == productNumber).SingleOrDefault(); } public void Purchase() { PurchaseArgs purchaseArgs = new PurchaseArgs(String.Format("The product "{0}" was just purchased.",this.Name)); OnPurchaseMade(this,purchaseArgs); } public void Log() { Console.WriteLine("Log: #{0} purchased.",this.ProductNumber); } } } 解决方法
始终定义这样的事件,不要使用自定义委托:
event EventHandler<EventArgsClassType> MyEventHandler; 或者,如果他们不参数: event EventHandler MyEventHandler; 通过基于 如果您的事件需要进一步的参数,则其EventArgsClassType必须从System.EventArgs继承. 此外,在实例化事件处理程序时,您不必使用此显式形式: product1.OnPurchaseMade += new Product.PurchaseHandler(NotifyUser); 因为方法组可以隐式转换为匹配的委托.因此,以下代码也可以正常工作: product1.OnPurchaseMade += NotifyUser; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |