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]);
}