| 
0
 | 
     1 using System;
 | 
| 
 | 
     2 using System.Linq;
 | 
| 
 | 
     3 using BLToolkit.Properties;
 | 
| 
 | 
     4 
 | 
| 
 | 
     5 namespace BLToolkit.Common
 | 
| 
 | 
     6 {
 | 
| 
 | 
     7 	/// <summary>
 | 
| 
 | 
     8 	/// This argument adapter class allows either names (strings) or
 | 
| 
 | 
     9 	/// indices (ints) to be passed to a function.
 | 
| 
 | 
    10 	/// </summary>
 | 
| 
 | 
    11 	[System.Diagnostics.DebuggerStepThrough]
 | 
| 
 | 
    12 	public struct NameOrIndexParameter
 | 
| 
 | 
    13 	{
 | 
| 
 | 
    14 		public NameOrIndexParameter(string name)
 | 
| 
 | 
    15 		{
 | 
| 
 | 
    16 			if (null == name)
 | 
| 
 | 
    17 				throw new ArgumentNullException("name");
 | 
| 
 | 
    18 
 | 
| 
 | 
    19 			if (name.Length == 0)
 | 
| 
 | 
    20 				throw new ArgumentException(Resources.NameOrIndexParameter_BadName, "name");
 | 
| 
 | 
    21 
 | 
| 
 | 
    22 			_name  = name;
 | 
| 
 | 
    23 			_index = 0;
 | 
| 
 | 
    24 		}
 | 
| 
 | 
    25 
 | 
| 
 | 
    26 		public NameOrIndexParameter(int index)
 | 
| 
 | 
    27 		{
 | 
| 
 | 
    28 			if (index < 0)
 | 
| 
 | 
    29 				throw new ArgumentException(Resources.NameOrIndexParameter_BadIndex, "index");
 | 
| 
 | 
    30 
 | 
| 
 | 
    31 			_name  = null;
 | 
| 
 | 
    32 			_index = index;
 | 
| 
 | 
    33 		}
 | 
| 
 | 
    34 
 | 
| 
 | 
    35 		public static implicit operator NameOrIndexParameter(string name)
 | 
| 
 | 
    36 		{
 | 
| 
 | 
    37 			return new NameOrIndexParameter(name);
 | 
| 
 | 
    38 		}
 | 
| 
 | 
    39 
 | 
| 
 | 
    40 		public static implicit operator NameOrIndexParameter(int index)
 | 
| 
 | 
    41 		{
 | 
| 
 | 
    42 			return new NameOrIndexParameter(index);
 | 
| 
 | 
    43 		}
 | 
| 
 | 
    44 
 | 
| 
 | 
    45 		#region Public properties
 | 
| 
 | 
    46 		
 | 
| 
 | 
    47 		public bool ByName
 | 
| 
 | 
    48 		{
 | 
| 
 | 
    49 			get { return null != _name; }
 | 
| 
 | 
    50 		}
 | 
| 
 | 
    51 
 | 
| 
 | 
    52 		private readonly string _name;
 | 
| 
 | 
    53 		public           string  Name
 | 
| 
 | 
    54 		{
 | 
| 
 | 
    55 			get
 | 
| 
 | 
    56 			{
 | 
| 
 | 
    57 				if (null == _name)
 | 
| 
 | 
    58 					throw new InvalidOperationException(
 | 
| 
 | 
    59 						"This instance was initialized by index");
 | 
| 
 | 
    60 				
 | 
| 
 | 
    61 				 return _name;
 | 
| 
 | 
    62 			}
 | 
| 
 | 
    63 		}
 | 
| 
 | 
    64 
 | 
| 
 | 
    65 		private readonly int _index;
 | 
| 
 | 
    66 		public           int  Index
 | 
| 
 | 
    67 		{
 | 
| 
 | 
    68 			get
 | 
| 
 | 
    69 			{
 | 
| 
 | 
    70 				if (null != _name)
 | 
| 
 | 
    71 					throw new InvalidOperationException(
 | 
| 
 | 
    72 						"This instance was initialized by name");
 | 
| 
 | 
    73 
 | 
| 
 | 
    74 				return _index;
 | 
| 
 | 
    75 			}
 | 
| 
 | 
    76 		}
 | 
| 
 | 
    77 
 | 
| 
 | 
    78 		#endregion
 | 
| 
 | 
    79 
 | 
| 
 | 
    80 		#region Static methods
 | 
| 
 | 
    81 
 | 
| 
 | 
    82 		public static NameOrIndexParameter[] FromStringArray(string[] names)
 | 
| 
 | 
    83 		{
 | 
| 
 | 
    84 			return names.Select(name => new NameOrIndexParameter(name)).ToArray();
 | 
| 
 | 
    85 		}
 | 
| 
 | 
    86 
 | 
| 
 | 
    87 		public static NameOrIndexParameter[] FromIndexArray(int[] indices)
 | 
| 
 | 
    88 		{
 | 
| 
 | 
    89 			return indices.Select(index => new NameOrIndexParameter(index)).ToArray();
 | 
| 
 | 
    90 		}
 | 
| 
 | 
    91 
 | 
| 
 | 
    92 		#endregion
 | 
| 
 | 
    93 		
 | 
| 
 | 
    94 		#region System.Object members
 | 
| 
 | 
    95 
 | 
| 
 | 
    96 		public override bool Equals(object obj)
 | 
| 
 | 
    97 		{
 | 
| 
 | 
    98 			if (obj is NameOrIndexParameter)
 | 
| 
 | 
    99 			{
 | 
| 
 | 
   100 				var nip = (NameOrIndexParameter)obj;
 | 
| 
 | 
   101 
 | 
| 
 | 
   102 				if (null != _name && null != nip._name && _name == nip._name)
 | 
| 
 | 
   103 					return true; // Same name
 | 
| 
 | 
   104 				
 | 
| 
 | 
   105 				if (null == _name && null == nip._name && _index == nip._index)
 | 
| 
 | 
   106 					return true; // Same index
 | 
| 
 | 
   107 
 | 
| 
 | 
   108 				return false;
 | 
| 
 | 
   109 			}
 | 
| 
 | 
   110 
 | 
| 
 | 
   111 			if (obj is string)
 | 
| 
 | 
   112 			{
 | 
| 
 | 
   113 				var name = (string)obj;
 | 
| 
 | 
   114 				return (null != _name && _name == name);
 | 
| 
 | 
   115 			}
 | 
| 
 | 
   116 
 | 
| 
 | 
   117 			if (obj is int)
 | 
| 
 | 
   118 			{
 | 
| 
 | 
   119 				var index = (int)obj;
 | 
| 
 | 
   120 				return (null == _name && _index == index);
 | 
| 
 | 
   121 			}
 | 
| 
 | 
   122 
 | 
| 
 | 
   123 			return false;
 | 
| 
 | 
   124 		}
 | 
| 
 | 
   125 
 | 
| 
 | 
   126 		public override int GetHashCode()
 | 
| 
 | 
   127 		{
 | 
| 
 | 
   128 			return (null != _name) ? _name.GetHashCode() : _index.GetHashCode();
 | 
| 
 | 
   129 		}
 | 
| 
 | 
   130 		
 | 
| 
 | 
   131 		public override string ToString()
 | 
| 
 | 
   132 		{
 | 
| 
 | 
   133 			return _name ?? "#" + _index;
 | 
| 
 | 
   134 		}
 | 
| 
 | 
   135 
 | 
| 
 | 
   136 		#endregion
 | 
| 
 | 
   137 
 | 
| 
 | 
   138 	}
 | 
| 
 | 
   139 }
 |