WEB开发网
开发学院软件开发C语言 Effective C# 原则43:请勿滥用反射 阅读

Effective C# 原则43:请勿滥用反射

 2009-02-19 08:17:35 来源:WEB开发网   
核心提示: 代码通过反射检测了类型,而且调用了默认的构造函数来创建了一个对象,Effective C# 原则43:请勿滥用反射(2),如果你须要在运行时创建一个预先不知道任何信息的类型实例,这是唯一的选择,那么应该使用类厂函数,而且使用相关的特性来标记它们(参见原则42),这是一段脆弱的代码,它依懒于

代码通过反射检测了类型,而且调用了默认的构造函数来创建了一个对象。如果你须要在运行时创建一个预先不知道任何信息的类型实例,这是唯一的选择。这是一段脆弱的代码,它依懒于默认的构造函数的存在。而且在你移除了MyType类型的默认构造函数时仍然是可以通过编译的。你必须在运行时完成检测,而且捕获任何可能出现的异常。一个完成同样功能的类厂函数,在构造函数被移除时是不能通过编译的:

public MyType NewInstance( )
{
 return new MyType();
}

(译注:其实VS.Net会给我们添加默认的构造函数,所以上面的两个方法都是可以编译,而且可以正确运行的。本人做过测试。但如果给构造函数添加访问限制,那么可以让类厂无法构造对象而产生编译时错误。)

你应该使用静态的类厂函数来取代依懒于反射的实例创建方法。如果你须要实例对象使用迟后数据绑定,那么应该使用类厂函数,而且使用相关的特性来标记它们(参见原则42)。

另一个反射的潜在的用处就是访问类型的成员。你可以使用成员名和类型在运行时来调用实际的函数:

// Example usage:
Dispatcher.InvokeMethod( AnObject, "MyHelperFunc" );
// Dispatcher Invoke Method:
public void InvokeMethod ( object o, string name )
{
 // Find the member functions with that name.
 MemberInfo[] myMembers = o.GetType( ).GetMember( name );
 foreach( MethodInfo m in myMembers )
 {
  // Make sure the parameter list matches:
  if ( m.GetParameters( ).Length == 0 )
   // Invoke:
   m.Invoke( o, null );
 }
}

上一页  1 2 3 4  下一页

Tags:Effective 原则 请勿

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