zoukankan      html  css  js  c++  java
  • .NET Framework基础知识(四)(转载)

    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:我的项目Day1401Day1401inDebugDay1401.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<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 = 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;  }
        }
     

    本文出自 “大懒丫头” 博客,请务必保留此出处http://lanyatou.blog.51cto.com/3306130/633162

  • 相关阅读:
    weui-switch开关控件,表单提交后如何取值
    [转]判断存储过程、触发器、视图是否存在并删除
    修改服务器的3389端口
    如何在react-native 中优雅的使用 redux
    react native js 与 native 的通信与交互方式
    对 JS virtual DOM 的一知半解
    Python的实例方法,类方法,静态方法之间的区别及调用关系
    redux 管理你的 react 应用
    react- native 入门
    git 指南
  • 原文地址:https://www.cnblogs.com/jameslif/p/5139272.html
Copyright © 2011-2022 走看看