internal static bool TryGet(TypeWrapper wrapper, PropertyInfo property, out FieldWrapper accessStub)
{
NameSigAttribute nameSig = AttributeHelper.GetNameSig(property);
bool hideFromReflection = AttributeHelper.IsHideFromReflection(property);
if (nameSig != null || hideFromReflection)
{
TypeWrapper type;
string name;
string sig;
if (nameSig == null)
{
type = ClassLoaderWrapper.GetWrapperFromType(property.PropertyType);
name = property.Name;
sig = type.SigName;
}
else
{
type = wrapper.GetClassLoader().FieldTypeWrapperFromSigNoThrow(nameSig.Sig);
name = nameSig.Name;
sig = nameSig.Sig;
}
Modifiers modifiers;
MemberFlags flags = MemberFlags.AccessStub;
if (hideFromReflection)
{
// it's a Type 1 access stub (to make inherited fields visible)
flags |= MemberFlags.HideFromReflection;
modifiers = GetModifiers(property);
}
else
{
// it's a Type 2 access stub (to make fields that have a non-public field type visible)
ModifiersAttribute attr = AttributeHelper.GetModifiersAttribute(property);
modifiers = attr.Modifiers;
if (attr.IsInternal)
{
flags |= MemberFlags.InternalAccess;
}
}
accessStub = new CompiledAccessStubFieldWrapper(wrapper, property, type, name, sig, modifiers, flags);
return true;
}
else
{
accessStub = null;
return false;
}
}