WEB开发网
开发学院软件开发C语言 Effective C# 原则24:选择申明式编程而不是命令式... 阅读

Effective C# 原则24:选择申明式编程而不是命令式编程

 2009-02-19 08:16:28 来源:WEB开发网   
核心提示: 下一步,你要写一个实现了IComparer接口的类,Effective C# 原则24:选择申明式编程而不是命令式编程(3),(在原则26中会详细的充分讨论比较,) ICompare有一个CompareTo()方法来比较两个给定类型的对象,可以发现默认的排序属性标记,而这个标记是基于已经比

下一步,你要写一个实现了IComparer接口的类。(在原则26中会详细的充分讨论比较。) ICompare有一个CompareTo()方法来比较两个给定类型的对象,把特性放在实现了IComparable的类上,就可以定义排序顺序了。构造函数对于通用的比较,可以发现默认的排序属性标记,而这个标记是基于已经比较过的类型。Compare方法对任何类型的两个对象进行排序,使用默认的排序属性:

internal class GenericComparer : IComparer
{
 // Information about the default property:
 private readonly PropertyDescriptor _sortProp;
 // Ascending or descending.
 private readonly bool _reverse = false;
 // Construct for a type
 public GenericComparer( Type t ) :
  this( t, false )
 {
 }
 // Construct for a type
 // and a direction
 public GenericComparer( Type t, bool reverse )
 {
  _reverse = reverse;
  // find the attribute,
  // and the name of the sort property:
  // Get the default sort attributes on the type:
  object [] a = t.GetCustomAttributes(
   typeof( DefaultSortAttribute ),false );
  // Get the PropertyDescriptor for that property:
  if ( a.Length > 0 )
  {
   DefaultSortAttribute sortName = a[ 0 ] as  DefaultSortAttribute;
   string name = sortName.Name;
   // Initialize the sort property:
   PropertyDescriptorCollection props =
    TypeDescriptor.GetProperties( t );
   if ( props.Count > 0 )
   {
    foreach ( PropertyDescriptor p in props )
    {
     if ( p.Name == name )
     {
      // Found the default sort property:
      _sortProp = p;
      break;
     }
    }
   }
  }
 }
 // Compare method.
 int IComparer.Compare( object left,
  object right )
 {
  // null is less than any real object:
  if (( left == null ) && ( right == null ))
   return 0;
  if ( left == null )
   return -1;
  if ( right == null )
   return 1;
  if ( _sortProp == null )
  {
   return 0;
  }
  // Get the sort property from each object:
  IComparable lField =
   _sortProp.GetValue( left ) as IComparable;
  IComparable rField =
   _sortProp.GetValue( right ) as IComparable;
  int rVal = 0;
  if ( lField == null )
   if ( rField == null )
    return 0;
   else
    return -1;
  rVal = lField.CompareTo( rField );
  return ( _reverse ) ? -rVal : rVal;
 }
}

上一页  1 2 3 4  下一页

Tags:Effective 原则 选择

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