能够后连编(后期绑定)组件,或者说是动态加载组件(包括从internet上)

解决方案 »

  1.   

    类、控件之间的未知调用,也可以用反射;
    object o = myMethod();//myMethod返回一个自定义的类;
    (o.GetType()).GetProperty("myProperty").SetValue(……);//用起来感觉很好!
      

  2.   

    在运行的时候可以查询类的信息。例如MSDN中对属性的使用例子就用的是反射.本教程展示如何创建自定义属性类,如何在代码中使用它们,以及如何通过反射查询它们。
      

  3.   

    示例文件
    请参阅“特性”示例以下载和生成本教程中讨论的示例文件。其他阅读材料
    C# 属性 
    17. 属性 
    AttributeUsage 
    在运行时了解类型信息 
    教程
    属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等等)相关联。与程序实体关联后,属性可在运行时查询,并可以以任意多种方式使用。属性的用法示例包括: 将帮助文档与程序实体关联(通过 Help 属性)。 
    将值编辑器关联到 GUI 框架中的特定类型(通过 ValueEditor 属性)。 
    除一个完整的示例外,本教程还包括以下主题: 声明属性类 您必须能够做的第一件事是声明属性。 
    使用属性类 创建属性后,接着应将属性与特定程序元素相关联。 
    通过反射访问属性 属性已与某程序元素关联后,可使用反射来查询属性存在及其值。 
    声明属性类
    在 C# 中声明属性很简单:它采取从 System.Attribute 继承的类声明的形式,并已用 AttributeUsage 属性标记,如下所示:using System;
    [AttributeUsage(AttributeTargets.All)]
    public class HelpAttribute : System.Attribute 
    {
       public readonly string Url;   public string Topic               // Topic is a named parameter
       {
          get 
          { 
             return topic; 
          }
          set 
          {         topic = value; 
          }
       }   public HelpAttribute(string url)  // url is a positional parameter
       {
          this.Url = url;
       }   private string topic;
    }
    代码讨论
    属性 AttributeUsage 指定该属性可以应用于的语言元素。 
    属性类是从 System.Attribute 派生的公共类,至少有一个公共构造函数。 
    属性类有两种类型的参数: 
    “定位参数”,每次使用属性时都必须指定这些参数。定位参数被指定为属性类的构造函数参数。在上面的示例中,url 便是一个定位参数。 
    “命名参数”,可选。如果使用属性时指定了命名参数,则必须使用参数的名称。通过包含非静态字段或属性来定义命名参数。在上面的示例中,Topic 便是一个命名参数。 
    属性参数限制为下列类型的常数值: 
    简单类型(bool、byte、char、short、int、long、float 和 double) 
    字符串 
    System.Type 
    枚举 
    对象(对象类型的属性参数的参数必须是属于上述类型之一的常数值。) 
    以上任意类型的一维数组 
    AttributeUsage 属性的参数
    属性 AttributeUsage 提供声明属性的基础机制。 AttributeUsage 具有一个定位参数: AllowOn 指定可以将属性赋给的程序元素(类、方法、属性、参数等等)。该参数的有效值可以在“.NET 框架”中的 System.Attributes.AttributeTargets 枚举中找到。该参数的默认值是所有程序元素 (AttributeElements.All)。 
    AttributeUsage 有一个命名参数: AllowMultiple 一个布尔值,指示是否可以为一个程序元素指定多个属性。该参数的默认值为 False。 
    使用属性类
    以下是使用上一节中声明的属性的简单示例:
      

  4.   

    lemon_zc1949(lemon) :
        我郑重的提示你,不要到处拷贝,你贴的这些东西我看过n编了。希望大家都能展示写心得体会而不是从msdn里狂抄乱贴。
      

  5.   

    把窗体封装到dll里,可以把程序分成几部分分发,可以实现根据需求购买模块,然后在主程序里使用反射生成窗体的实例,
      

  6.   

    当你的程序有了语意上的约定,并且你需要根据这些约定来访问dotnet的组成,那么你就需要使用反射了。使用反射,你可以:1.浏览 -浏览整个Domain下的所有Assembly下的所有类型的所有成员以及所有相关参数.
    2.定义 -得到具体的 Assembly,Module,Class,Member,Parameter .. 后,你能获取它的定义:
      例如名字,类型,访问修饰符,自定义属性,参数列表,继承关系,相关定义,等等..
    3.调用 -得到具体的 Class,Member .. 后,你就可以直接创建,获取,设置,执行它们.dotnet一般组成的结构是:Assembly
       Module
          Class
             MethodBase
                   Parameter
                Constructor
                Method
             Field
             Property
             Event参考
    Assembly.GetModules
    Assembly.GetTypes
    Type.GetMembers
    Type.GetConstructors
    Type.GetMethods
    Type.GetFields
    Type.GetProperites
    Type.GetEvents
    Type.GetNestedTypes
    MethodInfo.GetParameters...使用 System.Reflection.Emit 还可以在运行的时候直接构建IL代码组成的新的Assembly反射除了System.Type,System.Reflection.*外
    System.Array
    System.Enum
    System.Delegate
    都是重要的支持反射的类,请参考他们的public static方法.我的 Janc (现在的版本代号叫Rane) 是一个使用反射来实现的远程脚本的实现。
    原代码下载:http://www.lostinet.com/files/ChatSolution.rar
      

  7.   

    楼上的,我事先说了的啊,加深这些不知道查MSDN的程序员的影响呀。有些人他真的连资料都都不知道在哪儿找,你说怎么办?www.codeproject.com
      

  8.   

    反射在中的插件应用using System;
    using System.Reflection;
    using System.Collections;
    using System.Runtime.Remoting;namespace DeletgateLesson
    {
             //用于装载器同插件通讯的标准接口(自己定义)
    public interface ICard
    {
    void ShowCardInfo();
    } /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class App
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    //
    // TODO: 在此处添加代码以启动应用程序
    //
    System.Collections.ArrayList list = new System.Collections.ArrayList();
    Assembly a = Assembly.LoadFrom ("CardLib.dll");
    // Get the type names from the assembly.
    Type [] types2 = a.GetTypes ();
    foreach (Type t in types2)
    {
    if( t.GetInterface("ICard") != null )
    {
    Console.WriteLine ("{0} -> {1}", t.FullName, te.GUID.ToString() ); ICard card = System.Activator.CreateInstance(t);
    if( card != null )
    {

    list.Add( card );//加入插件数组,以后调用
    }

    } System.Console.Read();
    }
    }
    }
      

  9.   

    3色卡插件代码:
    using System;namespace DeletgateLesson
    {
    public interface ICard
    {
    void ShowCardInfo();
    } /// <summary>
    /// Card 的摘要说明。
    /// </summary>
    public class RedCard : ICard
    {
    public RedCard()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    public void ShowCardInfo()
    {
    System.Console.WriteLine( "I am a Red Card" );
    }
    } /// <summary>
    /// Card 的摘要说明。
    /// </summary>
    public class GreenCard:ICard
    {
    public GreenCard()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    public void ShowCardInfo()
    {
    System.Console.WriteLine( "I am a Green Card" );
    }
    } /// <summary>
    /// Card 的摘要说明。
    /// </summary>
    public class BlueCard:ICard
    {
    public BlueCard()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    public void ShowCardInfo()
    {
    System.Console.WriteLine( "I am a Blue Card" );
    }
    }
    }
    凡是需要加载器能加载的,必须要从ICard派生。Assembly a = Assembly.LoadFrom ("CardLib.dll"); 中 CardLib.dll可以是其他查件文件名称。
    这些技术我是在博客堂看见,
    在C#程序中实现插件架构 - Sunmast翻译http://www.csdn.net/develop/article/21/21963.shtm原文链接:
    http://www.cuj.com/documents/s=8209/cujweb0301walcheske/原文作者:
    Shawn Patrick Walcheske译者:
    电子科技大学 夏桅
      

  10.   

    lemon_zc1949(lemon) 你说的有道理
      

  11.   

    但是:当运行调试时发现
    ICard obj = (ICard)System.Activator.CreateInstance(t); 要出错。
    说类型无法转换.
    但obj确实不为null,为什么就是不能转换为ICard呢?错误信息是:未处理的“System.InvalidCastException”类型的异常出现在 DeletgateLesson.exe 中其他信息:指定的转换无效。请大家帮解决,谢谢!http://expert.csdn.net/Expert/topic/2602/2602741.xml?temp=9.469241E-02