FieldInfo GetFieldInfo(IField tag)
{
// If field is external, get its existing FieldInfo
ExternalField external = tag as ExternalField;
if (null != external)
{
return external.FieldInfo;
}
// If field is mapped from a generic type, get its mapped FieldInfo
// on the constructed type
GenericMappedField mapped = tag as GenericMappedField;
if (mapped != null)
{
return GetMappedFieldInfo(mapped.DeclaringType, mapped.SourceMember);
}
// If field is internal, get its FieldBuilder
return GetFieldBuilder(((InternalField)tag).Field);
}