diff Source/Reflection/GenericBinder.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/GenericBinder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+using System;
+using System.Globalization;
+using System.Reflection;
+
+namespace BLToolkit.Reflection
+{
+	/// <Summary>
+	/// Selects a member from a list of candidates, and performs type conversion
+	/// from actual argument type to formal argument type.
+	/// </Summary>
+	[Serializable]
+	public class GenericBinder : Binder
+	{
+		private readonly bool _genericMethodDefinition;
+		public GenericBinder(bool genericMethodDefinition)
+		{
+			_genericMethodDefinition = genericMethodDefinition;
+		}
+
+		#region System.Reflection.Binder methods
+
+		public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args,
+			ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state)
+		{
+			throw new InvalidOperationException("GenericBinder.BindToMethod");
+		}
+
+		public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture)
+		{
+			throw new InvalidOperationException("GenericBinder.BindToField");
+		}
+
+		public override MethodBase SelectMethod(
+			BindingFlags        bindingAttr,
+			MethodBase[]        matchMethods,
+			Type[]              parameterTypes,
+			ParameterModifier[] modifiers)
+		{
+			for (int i = 0; i < matchMethods.Length; ++i)
+			{
+				if (matchMethods[i].IsGenericMethodDefinition != _genericMethodDefinition)
+					continue;
+
+				ParameterInfo[] pis = matchMethods[i].GetParameters();
+				bool          match = (pis.Length == parameterTypes.Length);
+
+				for (int j = 0; match && j < pis.Length; ++j)
+				{
+					match = TypeHelper.CompareParameterTypes(pis[j].ParameterType, parameterTypes[j]);
+				}
+
+				if (match)
+					return matchMethods[i];
+			}
+
+			return null;
+		}
+
+		public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType,
+			Type[] indexes, ParameterModifier[] modifiers)
+		{
+			throw new InvalidOperationException("GenericBinder.SelectProperty");
+		}
+
+		public override object ChangeType(object value, Type type, CultureInfo culture)
+		{
+			throw new InvalidOperationException("GenericBinder.ChangeType");
+		}
+
+		public override void ReorderArgumentArray(ref object[] args, object state)
+		{
+			throw new InvalidOperationException("GenericBinder.ReorderArgumentArray");
+		}
+
+		#endregion
+
+		private static GenericBinder _generic;
+		public  static GenericBinder  Generic
+		{
+			get { return _generic ?? (_generic = new GenericBinder(true)); }
+		}
+
+		private static GenericBinder _nonGeneric;
+		public  static GenericBinder  NonGeneric
+		{
+			get { return _nonGeneric ?? (_nonGeneric = new GenericBinder(false)); }
+		}
+	}
+}