# 委托

# 委托delegate

public delegate void mydelegate();//定义了一个mydelegate的类型 ,用来保存方法
mydelegate md=new mydelegate(方法名)  存一个方法
md() 调一下委托
1.是一种数据类型,一般在命名空间中定义
2.定义委托时,需要指定返回值类型,委托名和参数名
3.委托是引用类型,就像类一样,所以委托声明后,如果不赋值变量为null,所以在使用委托变量前最好使用非空校验!=null   ?.
4.委托类型的变量只能赋值一个委托类型的对象
mydelegate md=new mydelegate(M1)
mydelegate md=M1
5.md.invoke()调用
1
2
3
4
5
6
7
8
9
10

# 泛型委托:

无返回值
action
action<T>
有返回值
func<T>    只有泛型版本的
//保存无参数无返回值得方法
action action=new action()
action()

public delegate void action <T1,T2,T3>()
action<string> a1=m=>{console.write()}
action<string,,int> a1=m=>{console.write()}

public delegate Tresult func<T1,T2,T3,Tresult>()
func<int,int,int> fun=(m,n)=>{return m+n}
int f=fun(m,n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 多播委托

一个委托可以储存多个方法
第一个要=赋值,后面的+=赋值
action<string> action=m1
action+=m2
action+=m3
action+=m4
action-=m3
action("aaaa")
delegate my=new delegate(t1);
md=delegate.combine(md,new mydelegate(T2))
md()
1
2
3
4
5
6
7
8
9
10
11

# 匿名方法,lambda表达式

匿名方法
mydelegate md=delegate(){console.write()}  

lambda:不用传数据类型
mydelegate md=()=>{console.write()}
mydelegate md=m=>{console.write(m)}
mydelegate md=(m,n)=>{console.write("m"+"n")}
1
2
3
4
5
6
7

# 事件

事件基于委托
只能-=,+=
public event action test;
声明委托和事件特别像,就是加一个event

因为委托来实现外部可以随便调用,不能将委托变成pirvate,也就无法调用
委托可以=赋值一旦=null,就全部取消掉了

事件编译就是私有的委托,但加了add和remove两个共有的方法
1
2
3
4
5
6
7
8
9

# 反射

动态加载程序集中的元数据,获取其类型,获取其属性,方法,来操作,(智能提示)
type mytype=typeof(my)
fieldinfo[] fields=mytype.getfields();获取字段
getmenber()获取成员
getevent()获取事件
getmethod()获取方法…………
拿到type有很多操作,可以获取很多
1
2
3
4
5
6
7
动态加载程序集
assembly ass=assembly.loadfile(@"路径");
获取说有程序集中的类型
type[] types=asm.gettypes()//获取所有类型
.getexportedtypes()//获取所有public类型

type typeperson=asm.gettypes(types[0])//获取第一个类型下所有类型
methodinfo method=typeperson.getmethod("方法名")获取方法
method.invoke(对象,参数)

无参
activator.createinstance(typeperson)//创建实例
有参
constructorinfo ci= typeperson.getconstructor(new type[]{typeof(string),typeof(string)}})
ci.invoke(new object[]{"zzzz","aaa"});

获取属性值
propertyinfo pinfo=typeperson.getproperty("name");
string a=pinfo.getvalue(object,null)

b.isassignablefrom(a) 类型检验  a能否赋值给b 父子类关系
a.issubclassf(b) 同上  与接口无关
.isinstanceoftype()  实例检验  父子类关系

.isabstract() 判断是否抽象类,接口,静态类(不能实例化的)

反射获取私有方法
methodinfo method=typeperson.getmethod("方法名",bindingflags.nopublic|bindingflags.instance)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 枚举

==没加[flags]显示数字==

==加[flags]显示枚举类型==

enum枚举
标志枚举[flags]不互斥
[Flags]
public enum Permission
{
    create = 1,
    read = 2,
    update = 4,
    delete = 8,
}
static void Main(string[] args)
{
    Permission permission = Permission.create | Permission.read | Permission.update | Permission.delete;
    Console.WriteLine("1、枚举创建,并赋值……");
    Console.WriteLine(permission.ToString());
    Console.WriteLine((int)permission);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 扩展方法

1.静态类、静态方法以及this关键字。
2.无法访问类的私有成员
3.静态类和类要同一个空间,否则要引用
public class person
{
    public void say()
    {}
}
public static class person
{
    public static  void say(this person p)
    {
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14