C#基础总结

来源:互联网 发布:鱼摆摆 for mac 编辑:程序博客网 时间:2024/06/05 14:13
  程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途:
    使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
    使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
    使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
    使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
    使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。
    使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。
    使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
    使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
    System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。
    反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。
    反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。
 
例子:实现带参数构造函数的反射
// 构建完整的Assembly名称和类型名称
string strAssembly = Application.StartupPath + "//你要反射的DLL";
string strTypeName = "你要反射射的类型的全名";
Type t = Assembly.LoadFrom(strAssembly).GetType(strTypeName);    //使用Load或能会好一些
Type[] types = new Type[1];
types[0] = typeof(string);
ConstructorInfo constructorInfoObj = t.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null,
CallingConventions.HasThis, types, null);
IPBOExplorerHandler obj = constructorInfoObj.Invoke(new string[]{"你的参数"}) as IPBOExplorerHandler;
 
反射实现简单工厂模式
1、定义接口
public interface IPBOExplorerHandler
2、实现接口
public class DOCExplorerHandler : IPBOExplorerHandler
public class CHGExplorerHandler  : IPBOExplorerHandler
public class PARTExplorerHandler : IPBOExplorerHandler
public class REQExplorerHandler  : IPBOExplorerHandler
3、反射实现
public static IPBOExplorerHandler CreateIPBO(string strHandlerName)
{
       string strAssembly = Application.StartupPath + "//ZTE.PDM.PART.WinUI.dll";
       string strTypeName = "ZTE.PDM.PART.WinUI." + strHandlerName;
       object  obj  = Activator.CreateInstance(Assembly.LoadFrom(strAssembly).GetType(strTypeName));
       IPBOExplorerHandler myHandler = obj as IPBOExplorerHandler;
       return myHandler;
}
4、简单工厂
public static IPBOExplorerHandler MakeIPBO(string strHandlerName)
{
    IPBOExplorerHandler myHandler;
    switch(strHandlerName)
    {
           case "DOC" : myHandler = new DOCExplorerHandler(); break;
           case "CHG" : myHandler = new CHGExplorerHandler(); break;
           case "PART" :myHandler = new PARTExplorerHandler();break;
           case "REQ" : myHandler = new REQExplorerHandler(); break;
           default: myHandler = new DOCExplorerHandler();break;
     }
     return myHandler;
}
 
原创粉丝点击