예제 #1
0
            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);
            }
예제 #2
0
            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));
        }
예제 #5
0
        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));
        }