Mercurial > pub > bltoolkit
comparison Source/Common/NameOrIndexParameter.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 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 } |
