事件委托反射程序集小总结

操作xml文件 Dom
XmlDocument
Save()
Load()
SelectSingleNode("Order/OrderItem[@Name='diannao']") 根据xpath找某个节点

SelectNodes()
DocumentElement  根节点

XmlNode 
XmlElement
SetAttribute();  设置属性
Attributes[].Value  读取属性
InnerText
InnerXml
ChildNodes


委托:类型安全的指向函数的指针
使用步骤
1:声明一个委托 delegate string DelString(string s)2:定义一个委托变量
让委托指向一个方法
DelString del = new DelString(ToUpper)
DelString del = ToUpper
3:使用委托
del(s);


Sort(object[] arr,DelCompare del);


List<string> list;
list.Sort(Comparision<T> com)


list.RemoveAll();
匿名方法
DelString del = delegate(string s)
{
Console.WriteLine(s);
}
多播委托
DelMath del = Add;
del += Sub;   del = del + Sub;
del += Mul;
del -= Mul;

事件
原理  定义一个事件的时候生成一个私有的委托
通过生成的add和remove方法对委托注册方法和移除方法
调用事件的时候最终调用的是委托指向的方法
使用步骤
1:定义事件
public event EventHandler PlayOver;
2:调用事件
if (PlayOver != null)
{
PlayOver(this, null);
}
3:外部注册事件
   Player1 p = new Player1("真的恨你");
   p.PlayOver += new PlayOverEventHandler(p_PlayOver);
   p.Play();
EventHandler 事件委托


EventArgs 事件源参数




了解
c#代码  编译   MSIL(中间语言)
MSIL  ---   编译(JIT)    cpu可执行的代码


程序集


反射
Assembly 程序集
GetExportedTypes()获得程序集中的公共类型
GetTypes() 获得程序集中的所有类型
GetType(name) 根据类的全名称字符串 获得程序集中的类型
LoadFile(path)动态从文件加载程序集
Type 数据类型的类型
获取Type
Type t = typeof(Person)
Person p = new Person();
Type t = p.GetType();
t.FullName 获取类型的全名称
t.IsAssignableFrom(t1)判断t1类型的对象是否可以赋给t的对象
typyof(IPlugin).IsAssignableFrom(typeof(ShutDown))
t.IsInstanceOfType(object o)判断o对象是否是t类型
t.IsSubclassOf(t1)判断t是否是t1的子类
t.GetProperties()获取t类型中的所有属性
t.GetMethods()获取t类型中的所有方法
PropertyInfo
MethodInfo
Invoke(object o,object[] param)动态调用方法
IsPublic
IsAbstract

//动态创建对象

object o =  Activator.CreateInstance(typeof(Person));



lvar关键字
var i = 5;//int
var j = 23.56;//double
var k = "C Sharp";//string
var x;//错误
var y = null;//错误
var z = { 1, 2, 3 };//错误
lvar强类型.根据后面的值自动推断类型,编译时把推断的类型替换掉var


匿名类型
lvarp1 = new { Id = 1, Name = "YJingLee", Age = 22 };//属性也不需要申明
lvarp2 = new { Id = 2, Name = "XieQing", Age = 25 };
l数组
var intArray = new[] { 2, 3, 5, 6 };
var strArray = new[] { "Hello","World" };
var objArray= new[] { new { Name = "YJingLee", Age = 22 }, new { Name ="XieQing", Age = 25 } };
var a = intArray[0];
var b = strArray[0];
var c = objArray[1].Name;


对象与集合初始化器
l对象初始化器
Student stu= new Student{ Id = 1, Name = "YJingLee", Age = 22 };
更方便给对象赋值
l集合初始化器
List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };
List< Student > stus= new List< Student >
{ new Student{Id=1,Name="YJingLee",Age=22},
new Student{Id=2,Name="XieQing",Age=25},
};


扩展方法
在StringHelper类中编写QuotedStr方法,使用时恐怖。判断一个字符串是否是正确的Email地址:IsEmail.
总感觉不是很好,要是看起来字符串有一个IsEmail方法多好呀。将IsEmail放到一个单独的类中,类声明为static(静态类),方法是静态方法,并且在第一个string上增加this。哇,string类“增加”IsEmail方法了,这只是假象,本质上仍然是静态方法,只不过C#提供了这样一个便利给大家,扩展方法内部不能调用被扩展类的私有、protected的东西。
声明扩展方法的步骤:类必须是static,方法是static,第一个参数是被扩展的对象,前面标注this。使用扩展方法的时候必须保证扩展方法类已经在当前代码中using


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用事件的具体案例: 1. 声明类型和事件 ```csharp public delegate void PriceChangedEventHandler(decimal oldPrice, decimal newPrice); public class Stock { private decimal _price; public event PriceChangedEventHandler PriceChanged; public decimal Price { get { return _price; } set { if (_price != value) { decimal oldPrice = _price; _price = value; OnPriceChanged(oldPrice, _price); } } } protected virtual void OnPriceChanged(decimal oldPrice, decimal newPrice) { PriceChanged?.Invoke(oldPrice, newPrice); } } ``` 2. 创建对象和事件处理程序 ```csharp public class Trader { public void OnPriceChanged(decimal oldPrice, decimal newPrice) { if (newPrice > oldPrice) { Console.WriteLine("Buy!"); } else if (newPrice < oldPrice) { Console.WriteLine("Sell!"); } else { Console.WriteLine("Hold!"); } } } Trader trader = new Trader(); Stock stock = new Stock(); stock.PriceChanged += new PriceChangedEventHandler(trader.OnPriceChanged); ``` 3. 触发事件 ```csharp stock.Price = 50; ``` 在上面的例子中,当股票价格发生变化时,会触发PriceChanged事件,并且调用事件处理程序OnPriceChanged。在这个例子中,事件处理程序只是简单地输出“Buy!”、“Sell!”或“Hold!”,但实际上事件处理程序可以执行任何操作,例如更新UI或执行业务逻辑。 通过使用事件,我们可以实现松耦合的设计,使得不同的组件可以独立地开发和测试,并且可以方便地进行扩展和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值