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