WEB开发网
开发学院软件开发C语言 Effective C# 原则42:使用特性进行简单的反射 阅读

Effective C# 原则42:使用特性进行简单的反射

 2009-02-19 08:17:38 来源:WEB开发网   
核心提示: 接下来,你须要把上面最后一行的注释替换成代码,Effective C# 原则42:使用特性进行简单的反射(2),这些代码要查找那些实现了命令句柄的类并且要安装这些句柄,加载完全程序集之后,前面这个例子表示CommandHandlerAttribute只能在类上使用,它不能应用在其它语言的元

接下来,你须要把上面最后一行的注释替换成代码,这些代码要查找那些实现了命令句柄的类并且要安装这些句柄。加载完全程序集之后,你就可以使用反射来查找程序集上所有暴露出来的类型,使用特性来标识出哪些暴露出来的类型包含命令句柄,以及哪些是命令句柄的方法。下面是一个添加了特性的类,即标记了命令句柄类型:

// Define the Command Handler Custom Attribute:
[AttributeUsage( AttributeTargets.Class )]
public class CommandHandlerAttribute : Attribute
{
 public CommandHandlerAttribute( )
 {
 }
}

这个特性就是你须要为每个命令标记的所有代码。总是用AttributeUsage 特性标记一个特性类,这就是告诉其它程序以及编译器,在哪些地方这个特性可以使用。前面这个例子表示CommandHandlerAttribute只能在类上使用,它不能应用在其它语言的元素上。

你可以调用GetCustomAttributes来断定某个类是否具有CommandHandlerAttribute特性。只有具有该特性的类型才是插件的候选类型 :

// Find all the assemblies in the Add-ins directory:
string AddInsDir = string.Format( "{0}/Addins", Application.StartupPath);
string[] assemblies = Directory.GetFiles( AddInsDir, "*.dll" );
foreach ( string assemblyFile in assemblies )
{
 Assembly asm = Assembly.LoadFrom( assemblyFile );
 // Find and install command handlers from the assembly.
 foreach( System.Type t in asm.GetExportedTypes( ))
 {
  if (t.GetCustomAttributes(
   typeof( CommandHandlerAttribute ), false ).Length > 0 )
  {
   // Found the command handler attribute on this type.
   // This type implements a command handler.
   // configure and add it.
  }
  // Else, not a command handler. Skip it.
 }
}

上一页  1 2 3 4 5  下一页

Tags:Effective 原则 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接