protected static object? GetValueFromMember()

in src/Microsoft.VisualStudio.Composition/ExportProvider.cs [653:698]


        protected static object? GetValueFromMember(object? exportingPart, MemberInfo exportingMember, Type? importingSiteElementType = null, Type? exportedValueType = null)
        {
            Requires.NotNull(exportingMember, nameof(exportingMember));

            if (exportingMember == null)
            {
                return exportingPart;
            }

            var field = exportingMember as FieldInfo;
            if (field != null)
            {
                return field.GetValue(exportingPart);
            }

            var property = exportingMember as PropertyInfo;
            if (property != null)
            {
                return property.GetValue(exportingPart);
            }

            var method = exportingMember as MethodInfo;
            if (method != null)
            {
                // If the method came from a property, return the result of the property getter rather than return the delegate.
                if (method.IsSpecialName && method.GetParameters().Length == 0 && method.Name.StartsWith("get_"))
                {
                    return method.Invoke(exportingPart, EmptyObjectArray);
                }

                object? target = method.IsStatic ? null : exportingPart;
                if (importingSiteElementType != null)
                {
                    Type delegateType = typeof(Delegate).GetTypeInfo().IsAssignableFrom(importingSiteElementType.GetTypeInfo())
                        ? importingSiteElementType
                        : (exportedValueType ?? ReflectionHelpers.GetContractTypeForDelegate(method));
                    return method.CreateDelegate(delegateType, target);
                }
                else
                {
                    return new ExportedDelegate(target, method);
                }
            }

            throw new NotSupportedException();
        }