Remove excessive shortcut key matching in ToolStrip
[mono.git] / mcs / class / System.ComponentModel.Composition / src / ComponentModel / System / ComponentModel / Composition / ReflectionModel / ImportingItem.cs
1 // -----------------------------------------------------------------------\r
2 // Copyright (c) Microsoft Corporation.  All rights reserved.\r
3 // -----------------------------------------------------------------------\r
4 using System;\r
5 using System.Collections;\r
6 using System.Collections.Generic;\r
7 using System.ComponentModel.Composition.Hosting;\r
8 using System.ComponentModel.Composition.Primitives;\r
9 using System.Globalization;\r
10 using System.Linq;\r
11 using Microsoft.Internal;\r
12 using Microsoft.Internal.Collections;\r
13 \r
14 namespace System.ComponentModel.Composition.ReflectionModel\r
15 {\r
16     internal abstract class ImportingItem\r
17     {\r
18         private readonly ContractBasedImportDefinition _definition;\r
19         private readonly ImportType _importType;\r
20 \r
21         protected ImportingItem(ContractBasedImportDefinition definition, ImportType importType)\r
22         {\r
23             Assumes.NotNull(definition);\r
24 \r
25             this._definition = definition;\r
26             this._importType = importType;\r
27         }\r
28 \r
29         public ContractBasedImportDefinition Definition\r
30         {\r
31             get { return this._definition; }\r
32         }\r
33 \r
34         public ImportType ImportType\r
35         {\r
36             get { return this._importType; }\r
37         }\r
38 \r
39         public object CastExportsToImportType(Export[] exports)\r
40         {\r
41             if (this.Definition.Cardinality == ImportCardinality.ZeroOrMore)\r
42             {\r
43                 return CastExportsToCollectionImportType(exports);\r
44             }\r
45             else\r
46             {\r
47                 return CastExportsToSingleImportType(exports);\r
48             }\r
49         }\r
50 \r
51         private object CastExportsToCollectionImportType(Export[] exports)\r
52         {\r
53             Assumes.NotNull(exports);\r
54 \r
55             // Element type could be null if the actually import type of the member is not a collection\r
56             // This particular case will end up failing when we set the member.\r
57             Type elementType = this.ImportType.ElementType ?? typeof(object);\r
58 \r
59             Array array = Array.CreateInstance(elementType, exports.Length);\r
60 \r
61             for (int i = 0; i < array.Length; i++)\r
62             {\r
63                 object value = CastSingleExportToImportType(elementType, exports[i]);\r
64 \r
65                 array.SetValue(value, i);\r
66             }\r
67 \r
68             return array;\r
69         }\r
70 \r
71         private object CastExportsToSingleImportType(Export[] exports)\r
72         {\r
73             Assumes.NotNull(exports);\r
74             Assumes.IsTrue(exports.Length < 2);\r
75 \r
76             if (exports.Length == 0)\r
77             {   \r
78                 return null;\r
79             }\r
80 \r
81             return CastSingleExportToImportType(this.ImportType.ActualType, exports[0]);\r
82         }\r
83 \r
84         private object CastSingleExportToImportType(Type type, Export export)\r
85         {\r
86             if (this.ImportType.CastExport != null)\r
87             {\r
88                 return this.ImportType.CastExport(export);\r
89             }\r
90 \r
91             return Cast(type, export);\r
92         }\r
93 \r
94         private object Cast(Type type, Export export)\r
95         {\r
96             // TODO: Need to catch CompositionException to provide\r
97             // additional information about what member we're setting\r
98             // and the current dependency graph.\r
99             object value = export.Value;\r
100 \r
101             object result;\r
102             if (!ContractServices.TryCast(type, value, out result))\r
103             {\r
104                 throw new ComposablePartException(\r
105                     CompositionErrorId.ReflectionModel_ImportNotAssignableFromExport,\r
106                     String.Format(CultureInfo.CurrentCulture,\r
107                         Strings.ReflectionModel_ImportNotAssignableFromExport,\r
108                         export.ToElement().DisplayName,\r
109                         type.FullName),\r
110                     this.Definition.ToElement());\r
111             }\r
112 \r
113             return result;\r
114         }\r
115     }\r
116 }