、反射:是编程的读取与类型相关联的元数据的行为。通过读取元数据,可以了解它是什么类型以及类型的成员。

比如类中的属性,方法,事件等。所属命名空间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基础知识(四)(转载)的更多相关文章

  1. RabbitMQ基础知识(转载)

    RabbitMQ基础知识(转载) 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需 ...

  2. Python基础知识(四)

    Python基础知识(四) 一丶列表 定义格式: 是一个容器,由 [ ]表示,元素与元素之间用逗号隔开. 如:name=["张三","李四"] 作用: 存储任意 ...

  3. C# 基础知识 (四).C#简单介绍及托管代码

            暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了非常多东西,也学到了非常多东西,也认识到了非常多不足之处!闲暇之余我准备又一次进一步巩固C#相关知识,包含 ...

  4. .NET Framework基础知识总结

    之前给大家总结了java的面试几次技巧总结,同学们看了觉得还是不错,能够得到大家的认可,感觉还是挺不错的.现在又有同学来想小编索要.NET面试的总结了,好吧.谁让小编这么好呢!以下是.NET面试之框架 ...

  5. C语言基础知识(四)——位操作

    一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位, ...

  6. .NET Framework基础知识(五)(转载)

    .程序集:是 .NET Framework 应用程序的构造块:程序集构成了部署.版本控制.重复使用.激活范围控制和 安全权限的基本单元. .程序集的优点:版本控制问题.最终解决DLL冲突 .程序集分为 ...

  7. .NET Framework基础知识(三)(转载)

    .正则表达式:用一串字符验证是否符合一种规范,这个规范就是正则表达式. .正则表达式中常用的元字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配空白符 \d 匹配数 ...

  8. .NET Framework基础知识(二)(转载)

    1.课外:为什么object数组可以赋值给object类型,int数组却不能赋值给int类型? 答:因为不管是什么什么数组都继承自Array,而Array又继承自object. 2.线程:是操作系统分 ...

  9. MySQL系列(一)--基础知识(转载)

    安装就不说了,网上多得是,我的MySQL是8.0版本,可以参考:CentOS7安装MySQL8.0图文教程和MySQL8.0本地访问设置为远程访问权限 我的MySQL安装在阿里云上面,阿里云向外暴露端 ...

随机推荐

  1. 经验之谈—让你看明确block

    事实上我感觉不常常使用block的朋友.对block应该是比較陌生的,那么如今我们来扒开block的真面目,看看block的本质 普通的局部变量.block内部仅仅会引用它初始的值(block定义那一 ...

  2. c# 查询sql 返回多个參数

    1.依据须要查询mysql 语句,返回三个须要的參数,不是数据集 2.编写函数例如以下: public static void GetParas(string 条件1, out string 返回值1 ...

  3. Android开发经验一判断当前屏幕是全屏还是非全屏

    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView ...

  4. 关于EJB--实体Bean的BMP和CMP选择

    EJB有两种主要类型BMP(Bean managed persistence )和CMP(Container managed persistence ),这两种类型各有优缺点. BMP是在Bean中完 ...

  5. IDFA和IMEI

    这里有一些解释: https://www.zhihu.com/question/38856446

  6. [React] Render Elements Outside the Current React Tree using Portals in React 16

    By default the React Component Tree directly maps to the DOM Tree. In some cases when you have UI el ...

  7. FreeNX

    freenx 在Linux下,我们最常使用的远程管理工具是ssh客户端,比如putty.SecureCRT等,但是ssh只提供字符界面的操作方式,有时我们需要图形界面的操作,在Linux下支持图形界面 ...

  8. 不同jquery对象触发相同的函数 “.js-story-title,.js-mt-index-cont2”

    $(document).on("click",".js-story-title,.js-mt-index-cont2",function () {}

  9. JS搜索菜单实现

    1 <!--菜单搜索功能--> 2 <!--先写静态页面--> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 ...

  10. Altium Designer布局移动原件的问题