FindMostSpecificField() private static method

private static FindMostSpecificField ( FieldInfo cur1, FieldInfo cur2 ) : int
cur1 System.Reflection.FieldInfo
cur2 System.Reflection.FieldInfo
return int
        public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo cultureInfo)
        {
            if (match == null)
            {
                throw new ArgumentNullException("match");
            }
            int num = 0;

            FieldInfo[] array = (FieldInfo[])match.Clone();
            if ((bindingAttr & BindingFlags.SetField) != BindingFlags.Default)
            {
                Type type = value.GetType();
                for (int i = 0; i < array.Length; i++)
                {
                    Type fieldType = array[i].FieldType;
                    if (fieldType == type)
                    {
                        array[num++] = array[i];
                    }
                    else if (value == Empty.Value && fieldType.IsClass)
                    {
                        array[num++] = array[i];
                    }
                    else if (fieldType == typeof(object))
                    {
                        array[num++] = array[i];
                    }
                    else if (fieldType.IsPrimitive)
                    {
                        if (DefaultBinder.CanConvertPrimitiveObjectToType(value, (RuntimeType)fieldType))
                        {
                            array[num++] = array[i];
                        }
                    }
                    else if (fieldType.IsAssignableFrom(type))
                    {
                        array[num++] = array[i];
                    }
                }
                if (num == 0)
                {
                    throw new MissingFieldException(Environment.GetResourceString("MissingField"));
                }
                if (num == 1)
                {
                    return(array[0]);
                }
            }
            int  num2 = 0;
            bool flag = false;

            for (int i = 1; i < num; i++)
            {
                int num3 = DefaultBinder.FindMostSpecificField(array[num2], array[i]);
                if (num3 == 0)
                {
                    flag = true;
                }
                else if (num3 == 2)
                {
                    num2 = i;
                    flag = false;
                }
            }
            if (flag)
            {
                throw new AmbiguousMatchException(Environment.GetResourceString("Arg_AmbiguousMatchException"));
            }
            return(array[num2]);
        }
Beispiel #2
0
        public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo cultureInfo)
        {
            if (match == null)
            {
                throw new ArgumentNullException("match");
            }
            int num = 0;

            FieldInfo[] fieldInfoArray = (FieldInfo[])match.Clone();
            if ((bindingAttr & BindingFlags.SetField) != BindingFlags.Default)
            {
                Type type = value.GetType();
                for (int index = 0; index < fieldInfoArray.Length; ++index)
                {
                    Type fieldType = fieldInfoArray[index].FieldType;
                    if (fieldType == type)
                    {
                        fieldInfoArray[num++] = fieldInfoArray[index];
                    }
                    else if (value == Empty.Value && fieldType.IsClass)
                    {
                        fieldInfoArray[num++] = fieldInfoArray[index];
                    }
                    else if (fieldType == typeof(object))
                    {
                        fieldInfoArray[num++] = fieldInfoArray[index];
                    }
                    else if (fieldType.IsPrimitive)
                    {
                        if (DefaultBinder.CanConvertPrimitiveObjectToType(value, (RuntimeType)fieldType))
                        {
                            fieldInfoArray[num++] = fieldInfoArray[index];
                        }
                    }
                    else if (fieldType.IsAssignableFrom(type))
                    {
                        fieldInfoArray[num++] = fieldInfoArray[index];
                    }
                }
                if (num == 0)
                {
                    throw new MissingFieldException(Environment.GetResourceString("MissingField"));
                }
                if (num == 1)
                {
                    return(fieldInfoArray[0]);
                }
            }
            int  index1 = 0;
            bool flag   = false;

            for (int index2 = 1; index2 < num; ++index2)
            {
                switch (DefaultBinder.FindMostSpecificField(fieldInfoArray[index1], fieldInfoArray[index2]))
                {
                case 0:
                    flag = true;
                    break;

                case 2:
                    index1 = index2;
                    flag   = false;
                    break;
                }
            }
            if (flag)
            {
                throw new AmbiguousMatchException(Environment.GetResourceString("Arg_AmbiguousMatchException"));
            }
            return(fieldInfoArray[index1]);
        }