Mercurial > pub > bltoolkit
comparison Source/Reflection/GenericBinder.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.Globalization; | |
| 3 using System.Reflection; | |
| 4 | |
| 5 namespace BLToolkit.Reflection | |
| 6 { | |
| 7 /// <Summary> | |
| 8 /// Selects a member from a list of candidates, and performs type conversion | |
| 9 /// from actual argument type to formal argument type. | |
| 10 /// </Summary> | |
| 11 [Serializable] | |
| 12 public class GenericBinder : Binder | |
| 13 { | |
| 14 private readonly bool _genericMethodDefinition; | |
| 15 public GenericBinder(bool genericMethodDefinition) | |
| 16 { | |
| 17 _genericMethodDefinition = genericMethodDefinition; | |
| 18 } | |
| 19 | |
| 20 #region System.Reflection.Binder methods | |
| 21 | |
| 22 public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, | |
| 23 ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state) | |
| 24 { | |
| 25 throw new InvalidOperationException("GenericBinder.BindToMethod"); | |
| 26 } | |
| 27 | |
| 28 public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture) | |
| 29 { | |
| 30 throw new InvalidOperationException("GenericBinder.BindToField"); | |
| 31 } | |
| 32 | |
| 33 public override MethodBase SelectMethod( | |
| 34 BindingFlags bindingAttr, | |
| 35 MethodBase[] matchMethods, | |
| 36 Type[] parameterTypes, | |
| 37 ParameterModifier[] modifiers) | |
| 38 { | |
| 39 for (int i = 0; i < matchMethods.Length; ++i) | |
| 40 { | |
| 41 if (matchMethods[i].IsGenericMethodDefinition != _genericMethodDefinition) | |
| 42 continue; | |
| 43 | |
| 44 ParameterInfo[] pis = matchMethods[i].GetParameters(); | |
| 45 bool match = (pis.Length == parameterTypes.Length); | |
| 46 | |
| 47 for (int j = 0; match && j < pis.Length; ++j) | |
| 48 { | |
| 49 match = TypeHelper.CompareParameterTypes(pis[j].ParameterType, parameterTypes[j]); | |
| 50 } | |
| 51 | |
| 52 if (match) | |
| 53 return matchMethods[i]; | |
| 54 } | |
| 55 | |
| 56 return null; | |
| 57 } | |
| 58 | |
| 59 public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType, | |
| 60 Type[] indexes, ParameterModifier[] modifiers) | |
| 61 { | |
| 62 throw new InvalidOperationException("GenericBinder.SelectProperty"); | |
| 63 } | |
| 64 | |
| 65 public override object ChangeType(object value, Type type, CultureInfo culture) | |
| 66 { | |
| 67 throw new InvalidOperationException("GenericBinder.ChangeType"); | |
| 68 } | |
| 69 | |
| 70 public override void ReorderArgumentArray(ref object[] args, object state) | |
| 71 { | |
| 72 throw new InvalidOperationException("GenericBinder.ReorderArgumentArray"); | |
| 73 } | |
| 74 | |
| 75 #endregion | |
| 76 | |
| 77 private static GenericBinder _generic; | |
| 78 public static GenericBinder Generic | |
| 79 { | |
| 80 get { return _generic ?? (_generic = new GenericBinder(true)); } | |
| 81 } | |
| 82 | |
| 83 private static GenericBinder _nonGeneric; | |
| 84 public static GenericBinder NonGeneric | |
| 85 { | |
| 86 get { return _nonGeneric ?? (_nonGeneric = new GenericBinder(false)); } | |
| 87 } | |
| 88 } | |
| 89 } | 
