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译者: 电子科技大学 夏桅
object o = myMethod();//myMethod返回一个自定义的类;
(o.GetType()).GetProperty("myProperty").SetValue(……);//用起来感觉很好!
请参阅“特性”示例以下载和生成本教程中讨论的示例文件。其他阅读材料
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。
使用属性类
以下是使用上一节中声明的属性的简单示例:
我郑重的提示你,不要到处拷贝,你贴的这些东西我看过n编了。希望大家都能展示写心得体会而不是从msdn里狂抄乱贴。
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
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();
}
}
}
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译者:
电子科技大学 夏桅
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