.NET Framework基础知识(四)(转载)
、反射:是编程的读取与类型相关联的元数据的行为。通过读取元数据,可以了解它是什么类型以及类型的成员。 比如类中的属性,方法,事件等。所属命名空间System.Reflection。
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Day1401
{
class Program
{
static void Main(string[] args)
{
}
public Program()
{
Console.WriteLine("无参构造函数!");
}
public Program(int i)
{
Console.WriteLine("有参构造函数!"+i);
}
public void method()
{
Console.WriteLine("方法!");
}
string str="bbb";
public string Str
{
get
{
return str;
}
set
{
str = value;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection; namespace Day1402
{
class Program
{
static void Main(string[] args)
{
//反射方法、无参构造函数
Assembly con1 = Assembly.LoadFrom(@"E:\我的项目\Day1401\Day1401\bin\Debug\Day1401.exe");
object obj = con1.CreateInstance("Day1401.Program");
MethodInfo mi = obj.GetType().GetMethod("method");
mi.Invoke(obj, null); //反射字段
FieldInfo fi = obj.GetType().GetField("str", BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine(fi.GetValue(obj)); //反射属性
PropertyInfo pi = obj.GetType().GetProperty("Str");
pi.SetValue(obj, "aaa", null);
Console.WriteLine(pi.GetValue(obj, null)); //反射有参构造函数
Type[] t1 = new Type[] { typeof(int)};
ConstructorInfo ci= obj.GetType().GetConstructor(t1);
object[] o = new object[] { };
ci.Invoke(o); //反射成员类型
Type type = typeof(Program);
MemberInfo[] MI = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
foreach (MemberInfo memb in MI)
{
Console.WriteLine("名称:{0},类型{1}", memb.Name, memb.MemberType.ToString());
}
}
}
}
、属性Attribute:这里的属性并非类的成员,它提供功能强大的方法以将声明信息与C#代码(类型、方法、属性)相关联。 属性与程序实体关联后,即可在运行时使用名为“反射”的技术查询属性。
属性出现的形式有两种:一种是在公共语言运行库中定义的属性,另一种是可以创建的用于向代码中添加附加信息的自定义属性。
属性的特点:)属性可向程序中添加元数据 )程序可以使用反射检查自己的元数据 )通常使用属性与com交互。
、自定义属性
语法:[attributeClass(定位参数|,...命名参数|,...)]
定位参数和相应特征类的实例构造器紧密相关——构造器提供了什么样的参数构造方式,位置参数就对应什么样的形式。 位置参数不可省略,但如果特征类提供了无参数的构造器,那就另当别论。
命名参数对应着特征类的实例公有域或实例属性,但它在实例化的时候并非必须,可以省略。
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Day1404
{
class Program
{
static void Main(string[] args)
{
foreach (object o in typeof(Zhu).GetCustomAttributes(true))
{
ShiziAttribute shizi = o as ShiziAttribute;
Console.WriteLine(shizi.Name);
}
}
}
[AttributeUsage(AttributeTargets.Class,AllowMultiple=true,Inherited=true)]
class ShiziAttribute : Attribute
{
string name;
double size;
public string Name
{
get
{
return name;
}
}
public double Size
{
get
{
return size;
}
set
{
size = value;
}
}
public ShiziAttribute(string name)
{
this.name = name;
}
}
[Shizi("老二",Size=0.9)]
[Shizi("老大",Size=1.0)]
class Zhu
{ }
}
、序列化:是将对象状态转换为可保存或传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。 这两个过程一起保证数据易于存储和传输。
、.NET Framework 提供了两个序列化技术:
()二进制序列化保持类型保真,这对于多次调用应用程序时保持对象状态非常有用。例如,通过将对象序列化到剪贴板, 可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等。远程处理使用序列化, “按值”在计算机或应用程序域之间传递对象。
()XML 序列化只序列化公共属性和字段,并且不保持类型保真。当您希望提供或使用数据而不限制使用该数据的应用程序时, 这一点非常有用。由于 XML 是开放式的标准,因此它对于通过 Web 共享数据来说是一个理想选择。 SOAP 同样是开放式的标准,这使它也成为一个理想选择。
、二进制序列化:可以将序列化定义为一个将对象状态存储到存储介质的过程。在这个过程中对象的公共字段 和私有字段以及类的名称,将转换成字节流,而字节流接着将写入数据流。
、二进制序列化需要的命名空间
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO; namespace Day1407
{
[Serializable]
public class Person
{
List<Person> list = new List<Person>();
public List<Person> List
{
get{return list;}
set { list = value; }
}
public int age;
public string name;
public bool Sex
{
get;
set;
}
} class Program
{
static void Main(string[] args)
{
Person perp = new Person();
Person per1 = new Person();
per1.age = ;
per1.name = "XiaoHui";
per1.Sex = false;
perp.List.Add(per1);
Person per2 = new Person();
per2.age = ;
per2.name = "ChenHui";
per2.Sex = true;
perp.List.Add(per2);
IFormatter formatter = new BinaryFormatter(); //序列化
Stream stream = new FileStream("F:/Myfile.bin", FileMode.Create, FileAccess.Write);
formatter.Serialize(stream,perp);
stream.Close(); //反序列化
Stream stream1 = new FileStream("F:/MyFile.bin", FileMode.Open, FileAccess.Read);
Person per = formatter.Deserialize(stream1) as Person;
foreach (Person p in per.List)
{
Console.WriteLine(p.name+" "+p.age+" "+p.Sex);
} stream1.Close();
}
}
}
、选择序列化:可以在要序列化的类前面加[Serializable]
例:[Serializable]
public class Person
{
[NonSerialized]
public int age;
public bool Sex
{ get; set; }
}
本文出自 “大懒丫头” 博客,请务必保留此出处http://lanyatou.blog.51cto.com/3306130/633162
.NET Framework基础知识(四)(转载)的更多相关文章
- RabbitMQ基础知识(转载)
RabbitMQ基础知识(转载) 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需 ...
- Python基础知识(四)
Python基础知识(四) 一丶列表 定义格式: 是一个容器,由 [ ]表示,元素与元素之间用逗号隔开. 如:name=["张三","李四"] 作用: 存储任意 ...
- C# 基础知识 (四).C#简单介绍及托管代码
暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了非常多东西,也学到了非常多东西,也认识到了非常多不足之处!闲暇之余我准备又一次进一步巩固C#相关知识,包含 ...
- .NET Framework基础知识总结
之前给大家总结了java的面试几次技巧总结,同学们看了觉得还是不错,能够得到大家的认可,感觉还是挺不错的.现在又有同学来想小编索要.NET面试的总结了,好吧.谁让小编这么好呢!以下是.NET面试之框架 ...
- C语言基础知识(四)——位操作
一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位, ...
- .NET Framework基础知识(五)(转载)
.程序集:是 .NET Framework 应用程序的构造块:程序集构成了部署.版本控制.重复使用.激活范围控制和 安全权限的基本单元. .程序集的优点:版本控制问题.最终解决DLL冲突 .程序集分为 ...
- .NET Framework基础知识(三)(转载)
.正则表达式:用一串字符验证是否符合一种规范,这个规范就是正则表达式. .正则表达式中常用的元字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配空白符 \d 匹配数 ...
- .NET Framework基础知识(二)(转载)
1.课外:为什么object数组可以赋值给object类型,int数组却不能赋值给int类型? 答:因为不管是什么什么数组都继承自Array,而Array又继承自object. 2.线程:是操作系统分 ...
- MySQL系列(一)--基础知识(转载)
安装就不说了,网上多得是,我的MySQL是8.0版本,可以参考:CentOS7安装MySQL8.0图文教程和MySQL8.0本地访问设置为远程访问权限 我的MySQL安装在阿里云上面,阿里云向外暴露端 ...
随机推荐
- ubuntu mysql 无法启动 简单排查
自己的站点非常久没有去上了,想打开发现竟然打不开了.所以就找了一系列的原因. vps不行了 dns解析出问题了 域名出问题了 简单排查之后,我的vps服务商用的是 ***(bandwagonhost) ...
- 小白学开发(iOS)OC_ block数据类型(2015-08-08)
// // main.m // block数据类型 // // Created by admin on 15/8/12. // Copyright (c) 2015年 admin. All r ...
- js---15,模拟数组的ecah方法
原型的另外一个作用就是扩展对象中的属性和方法的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http:// ...
- Java学习笔记三.2
5.继承 //Java中所有对象都显式/隐式的继承子Object类 class fu{ fu(){ System.out.println("fu..."+getNum()); sh ...
- 杠杆(leverage)就是支付保证金借钱进行交易,以小博大
杠杆(leverage)就是支付保证金借钱进行交易,以小博大: 比如你自己有100块,在向券商借100块,这就是杠杆交易了,杠杆简单地说来就是一个乘号,使用这个工具,可以放大投资的结果,无论最终的结果 ...
- 错误 make: Nothing to be done for 'default'
Makefile书写格式非常严格,all:<TAB缩进>make -C $(KDIR) M=$(PWD) $(EXTRA_CFLAGS) modulesdefault:<TAB缩进& ...
- Windows 下 Sublime Text 默认打开方式问题解决办法
Sublime Text 2 是很受ACMer喜爱的文本编辑器 但是绿色版删除后无法设置为默认打开方式...而且网上也没有给出明确的解决办法 注册表的解决办法: 删除 HKEY_CURRENT_USE ...
- ArcGIS 点要素新增点
IFeatureLayer layer = FrmMain.m_mapControl.get_Layer(0) as IFeatureLayer; IFeatureClass featureClass ...
- Xcode7 的两个小坑
Xcode7 还在 beta.时不时崩一下什么的倒也是预料之中的事.没料到的是之前用着好好的,今天升完 El Capitan 之后,模拟器竟然不见了,设备倒是在 schema 栏右边里能看到.只是注明 ...
- Python画图参数设置
https://blog.csdn.net/qiu931110/article/details/68130199