public override bool TryGetExport(CompositionContract contract, [NotNullWhen(true)] out object?export) { var importMany = contract.MetadataConstraints.Contains(new KeyValuePair <string, object>("IsImportMany", true)); var(contractType, metadataType) = GetContractType(contract.ContractType, importMany); if (metadataType != null) { var methodInfo = (from method in _exportProvider.GetType().GetTypeInfo().GetMethods() where method.Name == nameof(ExportProvider.GetExports) where method.IsGenericMethod && method.GetGenericArguments().Length == 2 where method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(string) select method).Single(); var parameterizedMethod = methodInfo.MakeGenericMethod(contractType, metadataType); export = parameterizedMethod.Invoke(_exportProvider, new[] { contract.ContractName }); RoslynDebug.AssertNotNull(export); } else { var methodInfo = (from method in _exportProvider.GetType().GetTypeInfo().GetMethods() where method.Name == nameof(ExportProvider.GetExports) where method.IsGenericMethod && method.GetGenericArguments().Length == 1 where method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(string) select method).Single(); var parameterizedMethod = methodInfo.MakeGenericMethod(contractType); export = parameterizedMethod.Invoke(_exportProvider, new[] { contract.ContractName }); RoslynDebug.AssertNotNull(export); } return(true); }
public override bool TryGetExport(CompositionContract contract, [NotNullWhen(true)] out object?export) { var importMany = contract.MetadataConstraints.Contains(new KeyValuePair <string, object>("IsImportMany", true)); var(contractType, metadataType) = GetContractType(contract.ContractType, importMany); if (metadataType != null) { var methodInfo = (from method in _exportProvider.GetType().GetTypeInfo().GetMethods() where method.Name == nameof(ExportProvider.GetExports) where method.IsGenericMethod && method.GetGenericArguments().Length == 2 where method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(string) select method).Single(); var parameterizedMethod = methodInfo.MakeGenericMethod(contractType, metadataType); export = parameterizedMethod.Invoke(_exportProvider, new[] { contract.ContractName }); } else { var methodInfo = (from method in _exportProvider.GetType().GetTypeInfo().GetMethods() where method.Name == nameof(ExportProvider.GetExports) where method.IsGenericMethod && method.GetGenericArguments().Length == 1 where method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(string) select method).Single(); var parameterizedMethod = methodInfo.MakeGenericMethod(contractType); export = parameterizedMethod.Invoke(_exportProvider, new[] { contract.ContractName }); } #pragma warning disable CS8762 // Parameter must have a non-null value when exiting in some condition. return(true); #pragma warning restore CS8762 // Parameter must have a non-null value when exiting in some condition. }
private static TResult InvokeGetExportedValueMethod <TResult>(Expression <Func <ExportProvider, TResult> > expr, ExportProvider provider, Type serviceType, string key) { var method = (expr.Body as MethodCallExpression).Method; var methodName = method.Name; var @params = new object[0]; if (key != null) { // with key @params = new object[] { key }; } return((TResult)provider.GetType() .GetMethods() .First(m => { if (m.Name != methodName) { return false; } if (!m.IsGenericMethod) { return false; } return m.GetParameters().Length == @params.Length; }).MakeGenericMethod(serviceType) .Invoke(obj: provider, parameters: @params.Length < 1 ? null : @params)); }
public static object GetExportedValue(this ExportProvider container, Type type) { // get a reference to the GetExportedValue<T> method MethodInfo methodInfo = container.GetType().GetMethods().First(d => d.Name == "GetExportedValueOrDefault" && d.GetParameters().Length == 0); // add the generic types to the method methodInfo = methodInfo.MakeGenericMethod(type); // invoke GetExportedValue<type>() return(methodInfo.Invoke(container, null)); }
public static object GetExportedValue(this ExportProvider container, Type type) { // get a reference to the GetExportedValue<T> method MethodInfo methodInfo = container.GetType().GetMethods() .Where(d => d.Name == "GetExportedValue" && d.GetParameters().Length == 0).First(); // create an array of the generic types that the GetExportedValue<T> method expects Type[] genericTypeArray = new Type[] { type }; // add the generic types to the method methodInfo = methodInfo.MakeGenericMethod(genericTypeArray); // invoke GetExportedValue<type>() return(methodInfo.Invoke(container, null)); }