Effective C# 原则43:请勿滥用反射
2009-02-19 08:17:35 来源:WEB开发网在上面的代码中,进行是错误被屏避。如果类型名字打错了,这个方法就找不到。就没有方法被调用。
这还只是一个简单的例子。要创建一个灵活的InvokeMethod版本,须要从GetParameters()方法上返回的参数列表中,检测所有出现的参数类型。这样的代码是很沉长的,而且很糟糕以至于我根本就不想浪费地方来演示。
反射的第三个用处就是访问数据成员。代码和访问成员函数的很类似:
// Example usage:
object field = Dispatcher.RetrieveField ( AnObject, "MyField" );
// elsewhere in the dispatcher class:
public object RetrieveField ( object o, string name )
{
// Find the field.
FieldInfo myField = o.GetType( ).GetField( name );
if ( myField != null )
return myField.GetValue( o );
else
return null;
}
和方法调用一样,使用反射来取回一个数据成员,要在一个字段上通过名字来调用类型查询,看它是否与请求的字段名相匹配。如果发现一个,就可以使用FieldInfo 结构来返回值。这个构造在.Net框架里是很常见的。数据绑定就是利用反射来查找这些标记了绑定操作的属性。在这种情况下,数据绑定的动态性质超过了它的开销。(译注:也就是说值得使用反射进行动态绑定。)
因此,如果反射是一个如此痛苦的事情,你就须要找一个更好更简单的可选方案。你有三个选择:首先就是使用接口。你可以为任何你所期望的类,结构来定义接口(参见原则19)。这可能会使用更清楚的代码来取代所有的反射代码:
IMyInterface foo = obj as IMyInterface;
if ( foo != null)
{
foo.DoWork( );
foo.Msg = "work is done.";
}
- ››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# 原则系列文章目录
更多精彩
赞助商链接