当前位置: 首页 > news >正文

双语言网站源码谷歌推广代理公司

双语言网站源码,谷歌推广代理公司,动漫新闻资讯站,网络营销方案设计毕业设计一、反射概念与Type类 1、程序在运行过程中,可以查看其他程序集或本身程序集中的元数据的行为叫做反射。 程序集:项目中所有代码以及嵌入式资源的集合。 元数据:我们编写的程序以及程序内数据。 2、反射的作用: 通过反射可以…

一、反射概念与Type类

1、程序在运行过程中,可以查看其他程序集或本身程序集中的元数据的行为叫做反射。

程序集:项目中所有代码以及嵌入式资源的集合。

元数据:我们编写的程序以及程序内数据。

2、反射的作用:

通过反射可以读取程序集(.dll、.exe)中代码内容

可以根据字符串类名,来动态创建类的对象

可以动态获取对象中的信息(方法、属性、字段)

可以根据字符串方法名称来调用执行

3、反射的常用类

1) Type类:设计用来包含类型的特性,可以获取程序使用的类型的信息。(可以获得一个类包含的成 员与方法。)

2)命名空间 using System.Reflection;

//实体人员类
public class Person{public string Name;public int Age;private int _ID;//属性public int ID{get{return _ID;}set{_ID=value;}}public DisplayID(){Console.WriteLine(_ID);}public DisplayName(){Console.WriteLine(Name);}public DisplayAge(){Console.WriteLine(Age);}
}
​using System.Threading.Tasks; //反射的命名空间
class Demo(){public void Test1(){Person per =new Person();Type tyPersonObj=per.GetType(); //反射定义//显示类的名称Console.WriteLine(tyPersonObj.Name);//显示类所属的命名空间Console.WriteLine(tyPersonObj.Namespace);//显示类所属的程序集Console.WriteLine(tyPersonObj.Assembly);//获取类是否为公共、密封、私有Console.WriteLine(tyPersonObj.IsPublic);//TrueConsole.WriteLine(tyPersonObj.IsSealed);//FalseConsole.WriteLine(tyPersonObj.IsPrimitive);//False//获取字段GetFields()方法FieldInfo[] ingoArray=tyPersonObj.GetFields();Foreach(FieldInfo item in ingoArray){Console.WriteLine(item.Name);}//获取属性GetProperties()方法PropertyInfo[] propArray=tyPersonObj.GetProperties();Foreach(PropertyInfo item in propArray){Console.WriteLine(item.Name);}//获取方法GetMethods()方法MethodInfo[] metgodArray=tyPersonObj.GetMethods();Foreach(MethodInfo item in metgodArray){Console.WriteLine(item.Name);}}static void Main(string[] args){Demo obj=new Demo();obj.Test1();}
}

 

二、程序集Assembly与动态调用

1) Assembly类:得到一个程序集中的反射信息

2)使用反射技术,来动态调用

缺点:运行速度慢

优点:可以使得类对象之间的调用关系在“运行期”进行低耦合调用,可以随着配置文件的改变进行改变。

3)程序集中的两种存在方式

*.dll形式存在的程序集(不能直接运行,是“类库”)

*.exe的程序集,可以点击直接运行

如何加载程序集:

Assembly.Load();//不推荐使用

Assembly.LoadFrom(“程序集的完整路径名称”);

//学习Assembly程序集
using System.Reflection;
class Demo{public void Test1(){//通过路径直接得到程序集的对象Assembly assObj=Assembly.LoadFrom(@"E:\System.dll");//通过程序及,得到程序集中所有的类Type[] typArray=assObj.GetTypes();foreach(Type item in typArray){Console.WriteLine(item.Name);}//根据类名与方法名(字符串),动态调用Type type=assObj.GetType("类名字符串");//包含命名空间的类名//根据type创建对象Object obj=Activator.CreateInstance(type);//动态调用类的无参构造方法//获得方法信息//Type[] typeArrayWuthPara={type(int)};//重载有参数确定方法重载中有参数MethodInfo method=type.GetMethod("方法名称字符串");//如果需要重载,则需要在后面添加一个新                                                        //的参数new Type[0],表示重载无参,重                                                       //载有参则调用新定义的Type数组名                                                             //typeArrayWuthPara//调用有参时添加的语句//object[] objArray=new object[1];//object[0]=参数;//调用方法method.Invoke(obj,null);//null表示没有参数,如果调用有参方法,null需要换成object数组名}static void Main(string[] args){Demo obj=new Dmeo();Obj.Test1();}
}

反射调用私有方法与属性

class Person{private int _ID;//属性public int ID{get{return _ID;}set{_ID=value;}}public void DisplayPrivate(){Console.WriteLine("person类,私有方法,一般情况不可能调用");}
}
​
using System.Reflection;
class Demo{//调用私有方法public void Test1(){string strClassName="Person";string strMethodName="DisplayPrivate";Assembly assObj=Assembly.LoadFrom(strClassName);//根据类名与方法名(字符串),动态调用Type type=assObj.GetType("类名字符串");//包含命名空间的类名//根据type创建对象Object obj=Activator.CreateInstance(type);//动态调用类的无参构造方法MethodInfo method=type.GetMethod("strMethodName",BindingFlags.NonPublic|BindingFlags.Instance);method.Invoke(obj,null);}//调用属性public void Test2(){string strClassName="Person";//类的名称string strPropertydName="ID";//属性的名称Assembly assObj=Assembly.LoadFrom(strClassName);//根据类名与方法名(字符串),动态调用Type type=assObj.GetType("类名字符串");//包含命名空间的类名//根据type创建对象Object obj=Activator.CreateInstance(type);//动态调用类的无参构造方法//获得属性PropertyInfo prop=type.Getproperty(strPropertydName);//设置属性prop.SetValue(obj,100);//得到属性值string result=prop.GetValue(obj,null).ToString();Console.WriteLine(result);}static void Main(string[] args){Demo obj=new Dmeo();Obj.Test1();Obj.Test2();}
}

三、Type深入方法

bool IsAssignableFrom(Type c) //用来判断一个类或接口是否另一个类的父类或接口

bool IsInstanceOfType(object o)//判读对象o 是否是当前类(或者子类)的实例,或者实现本接口

bool IsSubclassOf(Type c)//判断当前类是否为类c (参数)的子类

//父类
public class Men{}
//子类
public class ZhangSan:Men,ICanSpeak{}
//普通类 无继承
public class Dog{}
//接口
interface ICanSpeak{}
//学习Type更多的方法
//1.判断一个类是否为(参数)类的父类或者接口
//
//
//
using System.Reflection;
class Demo{//bool IsAssignableFrom(Type c) //用来判断一个类或接口是否另一个类的父类或接口public void Test1(){Type typeMen=typeof(Men);Type typeZhangSan=typeof(ZhangSan);Type typeDog=typeof(Dog);Type typeICanSpeak==typeof(ICanSpeak);//判断Men是ZhangSan的父类吗Console.WriteLine(typeMen.IsAssignableFrom(typeZhangSan));//true//判断Men是Dog的父类吗Console.WriteLine(typeMen.IsAssignableFrom(typeDog));//False//判断ICanSpeak是否为ZhangSan的接口Console.WriteLine(typeICanSpeak.IsAssignableFrom(typeZhangSan));//true//判断ICanSpeak是否为Dog的接口Console.WriteLine(typeICanSpeak.IsAssignableFrom(Dog));//false}//bool IsInstanceOfType(object o)//判读对象o 是否是当前类(或者子类)的实例,或者实现本接口public void Test2(){Type typeMen=typeof(Men);Type typeICanSpeak==typeof(ICanSpeak);Men MenObj=new Men();ZhangSan zhangsanObj=new ZhangSan();Dog dogObj=new Dog();//typeMen是MenObj的实例吗?Console.WriteLine(typeMen.IsInstanceOfType(MenObj));//TConsole.WriteLine(typeMen.IsInstanceOfType(zhangsanObj));//TConsole.WriteLine(typeMen.IsInstanceOfType(dogObj));//FConsole.WriteLine(typeICanSpeak.IsInstanceOfType(zhangsanObj));//TConsole.WriteLine(typeICanSpeak.IsInstanceOfType(MenObj));//F}//bool IsSubclassOf(Type c)//判断当前类是否为类c (参数)的子类 public void Test3(){Type typeMen=typeof(Men);Type typeZhangSan=typeof(ZhangSan);Type typeDog=typeof(Dog);Console.WriteLine(typeZhangSan.IsSubclassOf(typeMen));  //TConsole.WriteLine(typeDog.IsSubclassOf(typeMen));//F}static void Main(string[] args){Demo obj=new Demo();obj.Test1();obj.Test2();obj.Test3();}
}

四、预定义特性Attribute

1.特性(Attribute)是一种允许我们向程序集增加元数据的语言结构,提供了一种将声明性信息与代码关联起来的途径。

2.Obsolete特性将过时的方法与类标注为“过时”(过期)的,且在编译时,显示警告信息。

3.Conditional特性一般用于程序开发过程中的“测试方法”的编写。测试阶段定义“测试的宏”,发布商业版本,则取消宏即可。

/*学习特性一:系统特性1:Obsolete特性(即:过时特性)2:Conditional特性 3:Serializable 声明结构可以被序列化4:NonSerialized 声明结构不可以被序列化5:DLLImport 声明是非托管代码实现的二、自定义特性三、条件编译1.特性Conditional 适用条件:针对方法2.使用"预编译”指令 #if debug  表达式#else表达式#endif
*/
#define OnlyTest //定义一个宏,表示允许Conditional特性标识的测试方法允许
#define debug //定义一个宏,表示调试阶段debug允许运行,但else不允许允许
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Therading.Tasks;
using System.Reflection;//反射的命名空间
using System.Diagnostics;//Conditional特性的命名空间,Obsolete不受影响
namespace 学习特性{class Demo1{//学习Obsolete如果加参数True,旧方法不可用,会引发错误,不加则默认false仅提醒自定义的字符串[Obsolete("该方法已过时,请用对应的NewMethod进行替换",true)]public void OldMethod(){Console.WriteLine("这是旧的方法");}public void NewMethod(){Console.WriteLine("这是新的方法");}public void Test1(){//OldMethod();NewMethod();}//学习Conditional ,条件执行,默认不执行[Conditional("OnlyTest")]public void TestMethod(){Console.WriteLine("这是测试方法");}public void Method1(){Console.WriteLine("这是方法1");}public void Method2(){Console.WriteLine("这是方法2");}//条件编译public void Test3(){Console.WriteLine("这是条件编译");Console.WriteLine("aaa");
#if debugConsole.WriteLine("bbb");
#elseConsole.WriteLine("ccc");
#endifConsole.WriteLine("ddd");}public void Test2(){TestMethod();Method2;TestMethod();Method1;TestMethod();Method1;Method2;Method1;}static void Main(string[] args){Demo1 obj=new Demo1();obj.Test1();obj.Test2();obj.Test3();}}
}

http://www.dt0577.cn/news/51641.html

相关文章:

  • 福州百度seo排名软件seo的作用是什么
  • 深圳企业做网站搜索引擎优化入门
  • 做网站图片多大seo标题优化关键词怎么选
  • 做的网站没有手机版百度极速版下载安装
  • 网站用什么好百度app下载官方免费下载最新版
  • 北京网站定制报价网络搜索引擎
  • 西安是哪个省的城市seo搜索引擎优化平台
  • 前几年做哪个网站致富seo整站排名
  • 动态网页毕业设计商丘关键词优化推广
  • 个人网站怎么做支付宝接口百度seo在线优化
  • 常州自助做网站推广软文范文800字
  • 厦门手机网站建设是什么百度集团总部在哪里
  • 自助建站哪个好南京seo报价
  • 公司做网站还是做阿里好呢免费申请网站
  • 怎样做自己的销售网站网络营销的特点包括
  • 厦门市建设工程造价网站免费发软文的网站
  • 建设部网站资质人员查询百度关键词排名代做
  • 沈阳做网站优化的公司运营推广是做什么的
  • 网站建设设计合同书广告多的网站
  • 长春网站建设新格免费网站seo诊断
  • 自己做网站是否要买云主机搜索排名影响因素
  • 给个网站谢谢网站推广渠道
  • 建立网站就是制作网页对吗前端seo搜索引擎优化
  • php网站开发实例 电子书seo优化推广工程师
  • 一个网站怎么做流量统计手机登录百度pc端入口
  • 肇庆cms建站系统西安网络推广运营公司
  • 推广型的网站怎么做百度搜索app
  • 南京哪里可以做网站常见的网络直接营销有哪些
  • 西宁网站制作费用是多少钱今日头条网页版入口
  • 刚做的婚恋网站怎么推广化妆品网络营销策划方案