Effective C# 原则43:请勿滥用反射
2009-02-19 08:17:35 来源:WEB开发网代码通过反射检测了类型,而且调用了默认的构造函数来创建了一个对象。如果你须要在运行时创建一个预先不知道任何信息的类型实例,这是唯一的选择。这是一段脆弱的代码,它依懒于默认的构造函数的存在。而且在你移除了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 );
}
}
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
- ››Effective C# 原则48:了解更多的工具和资源
- ››Effective C# 原则49:为C#2.0做好准备
- ››Effective C# 原则50:了解ECMA标准
- ››Effective C# 原则系列文章目录
更多精彩
赞助商链接