Fix bugs in sizing TableLayoutPanel (Xamarin bug 18638)
[mono.git] / mcs / class / System.ComponentModel.Composition / src / ComponentModel / System / ComponentModel / Composition / ReflectionModel / ReflectionExtensions.cs
1 // -----------------------------------------------------------------------\r
2 // Copyright (c) Microsoft Corporation.  All rights reserved.\r
3 // -----------------------------------------------------------------------\r
4 using System;\r
5 using System.Reflection;\r
6 using Microsoft.Internal;\r
7 using System.Threading;\r
8 using System.Collections.Generic;\r
9 \r
10 namespace System.ComponentModel.Composition.ReflectionModel\r
11 {\r
12     internal static class ReflectionExtensions\r
13     {\r
14         public static ReflectionMember ToReflectionMember(this LazyMemberInfo lazyMember)\r
15         {\r
16             MemberInfo[] accessors = lazyMember.GetAccessors();\r
17             MemberTypes memberType = lazyMember.MemberType;\r
18 \r
19             switch (memberType)\r
20             {\r
21                 case MemberTypes.Field:\r
22                     Assumes.IsTrue(accessors.Length == 1);\r
23                     return ((FieldInfo)accessors[0]).ToReflectionField();\r
24 \r
25                 case MemberTypes.Property:\r
26                     Assumes.IsTrue(accessors.Length == 2);\r
27                     return ReflectionExtensions.CreateReflectionProperty((MethodInfo)accessors[0], (MethodInfo)accessors[1]);\r
28 \r
29                 case MemberTypes.NestedType:\r
30                 case MemberTypes.TypeInfo:\r
31                     return ((Type)accessors[0]).ToReflectionType();\r
32 \r
33                 default:\r
34                     Assumes.IsTrue(memberType == MemberTypes.Method);\r
35                     return ((MethodInfo)accessors[0]).ToReflectionMethod();\r
36             }\r
37         }\r
38 \r
39         public static LazyMemberInfo ToLazyMember(this ReflectionMember reflectionMember)\r
40         {\r
41             Assumes.NotNull(reflectionMember);\r
42 \r
43             if (reflectionMember.ItemType == ReflectionItemType.Property)\r
44             {\r
45                 ReflectionProperty reflectionProperty = reflectionMember as ReflectionProperty;\r
46                 Assumes.NotNull(reflectionProperty);\r
47 \r
48                 MemberInfo[] accessors = new MemberInfo[] { reflectionProperty.UnderlyingGetMethod, reflectionProperty.UnderlyingSetMethod };\r
49                 return new LazyMemberInfo(MemberTypes.Property, accessors);\r
50             }\r
51             else\r
52             {\r
53                 return new LazyMemberInfo(reflectionMember.UnderlyingMember.MemberType, reflectionMember.UnderlyingMember);\r
54             }\r
55         }\r
56 \r
57         public static LazyMemberInfo ToLazyMember(this MemberInfo member)\r
58         {\r
59             Assumes.NotNull(member);\r
60 \r
61             if (member.MemberType == MemberTypes.Property)\r
62             {\r
63                 PropertyInfo property = member as PropertyInfo;\r
64                 Assumes.NotNull(property);\r
65 \r
66                 MemberInfo[] accessors = new MemberInfo[] { property.GetGetMethod(true), property.GetSetMethod(true)};\r
67                 return new LazyMemberInfo(MemberTypes.Property, accessors);\r
68             }\r
69             else\r
70             {\r
71                 return new LazyMemberInfo(member);\r
72             }\r
73         }\r
74 \r
75         public static ReflectionWritableMember ToReflectionWriteableMember(this LazyMemberInfo lazyMember)\r
76         {\r
77             Assumes.IsTrue((lazyMember.MemberType == MemberTypes.Field) || (lazyMember.MemberType == MemberTypes.Property));\r
78 \r
79             ReflectionWritableMember reflectionMember = lazyMember.ToReflectionMember() as ReflectionWritableMember;\r
80             Assumes.NotNull(reflectionMember);\r
81 \r
82             return reflectionMember;\r
83         }\r
84 \r
85 \r
86         public static ReflectionProperty ToReflectionProperty(this PropertyInfo property)\r
87         {\r
88             Assumes.NotNull(property);\r
89             return CreateReflectionProperty(property.GetGetMethod(true), property.GetSetMethod(true));\r
90         }\r
91 \r
92         public static ReflectionProperty CreateReflectionProperty(MethodInfo getMethod, MethodInfo setMethod)\r
93         {\r
94             Assumes.IsTrue(getMethod != null || setMethod != null);\r
95 \r
96             return new ReflectionProperty(getMethod, setMethod);\r
97         }\r
98 \r
99         public static ReflectionParameter ToReflectionParameter(this ParameterInfo parameter)\r
100         {\r
101             Assumes.NotNull(parameter);\r
102             return new ReflectionParameter(parameter);\r
103         }\r
104 \r
105         public static ReflectionMethod ToReflectionMethod(this MethodInfo method)\r
106         {\r
107             Assumes.NotNull(method);\r
108             return new ReflectionMethod(method);\r
109         }\r
110 \r
111         public static ReflectionField ToReflectionField(this FieldInfo field)\r
112         {\r
113             Assumes.NotNull(field);\r
114             return new ReflectionField(field);\r
115         }\r
116 \r
117         public static ReflectionType ToReflectionType(this Type type)\r
118         {\r
119             Assumes.NotNull(type);\r
120             return new ReflectionType(type);\r
121         }\r
122 \r
123         public static ReflectionWritableMember ToReflectionWritableMember(this MemberInfo member)\r
124         {\r
125             Assumes.NotNull(member);\r
126             if (member.MemberType == MemberTypes.Property)\r
127             {\r
128                 return ((PropertyInfo)member).ToReflectionProperty();\r
129             }\r
130 \r
131             return ((FieldInfo)member).ToReflectionField();\r
132         }\r
133     }\r
134 }\r