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

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

 2009-02-19 08:17:35 来源:WEB开发网   
核心提示: 在上面的代码中,进行是错误被屏避,Effective C# 原则43:请勿滥用反射(3),如果类型名字打错了,这个方法就找不到,你有三个选择:首先就是使用接口,你可以为任何你所期望的类,就没有方法被调用,这还只是一个简单的例子

在上面的代码中,进行是错误被屏避。如果类型名字打错了,这个方法就找不到。就没有方法被调用。

这还只是一个简单的例子。要创建一个灵活的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.";
}

上一页  1 2 3 4  下一页

Tags:Effective 原则 请勿

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