1、反射:是編程的讀取與類型相關(guān)聯(lián)的元數(shù)據(jù)的行為。通過(guò)讀取元數(shù)據(jù),可以了解它是什么類型以及類型的成員。比如類中的屬性,方法,事件等。所屬命名空間System.Reflection。
例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
創(chuàng)新互聯(lián)公司專注于企業(yè)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、宜都網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)、商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為宜都等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
namespace Day1401
{
class Program
{
static void Main(string[] args)
{
}
public Program()
{
Console.WriteLine("無(wú)參構(gòu)造函數(shù)!");
}
public Program(int i)
{
Console.WriteLine("有參構(gòu)造函數(shù)!"+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)
{
//反射方法、無(wú)參構(gòu)造函數(shù)
Assembly con1 = Assembly.LoadFrom(@"E:\我的項(xiàng)目\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));
//反射有參構(gòu)造函數(shù)
Type[] t1 = new Type[] { typeof(int)};
ConstructorInfo ci= obj.GetType().GetConstructor(t1);
object[] o = new object[] { 66};
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());
}
}
}
}
2、屬性Attribute:這里的屬性并非類的成員,它提供功能強(qiáng)大的方法以將聲明信息與C#代碼(類型、方法、屬性)相關(guān)聯(lián)。屬性與程序?qū)嶓w關(guān)聯(lián)后,即可在運(yùn)行時(shí)使用名為“反射”的技術(shù)查詢屬性。
屬性出現(xiàn)的形式有兩種:一種是在公共語(yǔ)言運(yùn)行庫(kù)中定義的屬性,另一種是可以創(chuàng)建的用于向代碼中添加附加信息的自定義屬性。
屬性的特點(diǎn):1)屬性可向程序中添加元數(shù)據(jù) 2)程序可以使用反射檢查自己的元數(shù)據(jù) 3)通常使用屬性與com交互。
3、自定義屬性
語(yǔ)法:[attributeClass(定位參數(shù)|,...命名參數(shù)|,...)]
定位參數(shù)和相應(yīng)特征類的實(shí)例構(gòu)造器緊密相關(guān)——構(gòu)造器提供了什么樣的參數(shù)構(gòu)造方式,位置參數(shù)就對(duì)應(yīng)什么樣的形式。位置參數(shù)不可省略,但如果特征類提供了無(wú)參數(shù)的構(gòu)造器,那就另當(dāng)別論。
命名參數(shù)對(duì)應(yīng)著特征類的實(shí)例公有域或?qū)嵗龑傩裕趯?shí)例化的時(shí)候并非必須,可以省略。
例: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
{ }
}
4、序列化:是將對(duì)象狀態(tài)轉(zhuǎn)換為可保存或傳輸?shù)男问降倪^(guò)程。序列化的補(bǔ)集是反序列化,后者將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過(guò)程一起保證數(shù)據(jù)易于存儲(chǔ)和傳輸。
5、.NET Framework 提供了兩個(gè)序列化技術(shù):
(1)二進(jìn)制序列化保持類型保真,這對(duì)于多次調(diào)用應(yīng)用程序時(shí)保持對(duì)象狀態(tài)非常有用。例如,通過(guò)將對(duì)象序列化到剪貼板,可在不同的應(yīng)用程序之間共享對(duì)象。您可以將對(duì)象序列化到流、磁盤、內(nèi)存和網(wǎng)絡(luò)等。遠(yuǎn)程處理使用序列化,“按值”在計(jì)算機(jī)或應(yīng)用程序域之間傳遞對(duì)象。
(2)XML 序列化只序列化公共屬性和字段,并且不保持類型保真。當(dāng)您希望提供或使用數(shù)據(jù)而不限制使用該數(shù)據(jù)的應(yīng)用程序時(shí),這一點(diǎn)非常有用。由于 XML 是開(kāi)放式的標(biāo)準(zhǔn),因此它對(duì)于通過(guò) Web 共享數(shù)據(jù)來(lái)說(shuō)是一個(gè)理想選擇。SOAP 同樣是開(kāi)放式的標(biāo)準(zhǔn),這使它也成為一個(gè)理想選擇。
6、二進(jìn)制序列化:可以將序列化定義為一個(gè)將對(duì)象狀態(tài)存儲(chǔ)到存儲(chǔ)介質(zhì)的過(guò)程。在這個(gè)過(guò)程中對(duì)象的公共字段和私有字段以及類的名稱,將轉(zhuǎn)換成字節(jié)流,而字節(jié)流接著將寫(xiě)入數(shù)據(jù)流。
7、二進(jìn)制序列化需要的命名空間
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
public 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 = 18;
per1.name = "XiaoHui";
per1.Sex = false;
perp.List.Add(per1);
Person per2 = new Person();
per2.age = 20;
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();
}
}
}
8、選擇序列化:可以在要序列化的類前面加[Serializable]
例:[Serializable]
public class Person
{
[NonSerialized]
public int age;
public bool Sex
{ get; set; }
}