资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

.NETFramework基础知识(四)-创新互联

1、反射:是编程的读取与类型相关联的元数据的行为。通过读取元数据,可以了解它是什么类型以及类型的成员。比如类中的属性,方法,事件等。所属命名空间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[] { 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:这里的属性并非类的成员,它提供功能强大的方法以将声明信息与C#代码(类型、方法、属性)相关联。属性与程序实体关联后,即可在运行时使用名为“反射”的技术查询属性。
属性出现的形式有两种:一种是在公共语言运行库中定义的属性,另一种是可以创建的用于向代码中添加附加信息的自定义属性。
属性的特点:1)属性可向程序中添加元数据 2)程序可以使用反射检查自己的元数据 3)通常使用属性与com交互。
3、自定义属性
语法:[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
   { }
}
4、序列化:是将对象状态转换为可保存或传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程一起保证数据易于存储和传输。
5、.NET Framework 提供了两个序列化技术:
(1)二进制序列化保持类型保真,这对于多次调用应用程序时保持对象状态非常有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等。远程处理使用序列化,“按值”在计算机或应用程序域之间传递对象。
(2)XML 序列化只序列化公共属性和字段,并且不保持类型保真。当您希望提供或使用数据而不限制使用该数据的应用程序时,这一点非常有用。由于 XML 是开放式的标准,因此它对于通过 Web 共享数据来说是一个理想选择。SOAP 同样是开放式的标准,这使它也成为一个理想选择。
6、二进制序列化:可以将序列化定义为一个将对象状态存储到存储介质的过程。在这个过程中对象的公共字段和私有字段以及类的名称,将转换成字节流,而字节流接着将写入数据流。
7、二进制序列化需要的命名空间
 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 list = new List();
       public List 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; }
   }

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页名称:.NETFramework基础知识(四)-创新互联
转载来源:http://cdkjz.cn/article/dpsosj.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220