1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Reflection;
\r
6 using Microsoft.Internal;
\r
7 using System.Threading;
\r
8 using System.Collections.Generic;
\r
10 namespace System.ComponentModel.Composition.ReflectionModel
\r
12 internal static class ReflectionExtensions
\r
14 public static ReflectionMember ToReflectionMember(this LazyMemberInfo lazyMember)
\r
16 MemberInfo[] accessors = lazyMember.GetAccessors();
\r
17 MemberTypes memberType = lazyMember.MemberType;
\r
21 case MemberTypes.Field:
\r
22 Assumes.IsTrue(accessors.Length == 1);
\r
23 return ((FieldInfo)accessors[0]).ToReflectionField();
\r
25 case MemberTypes.Property:
\r
26 Assumes.IsTrue(accessors.Length == 2);
\r
27 return ReflectionExtensions.CreateReflectionProperty((MethodInfo)accessors[0], (MethodInfo)accessors[1]);
\r
29 case MemberTypes.NestedType:
\r
30 case MemberTypes.TypeInfo:
\r
31 return ((Type)accessors[0]).ToReflectionType();
\r
34 Assumes.IsTrue(memberType == MemberTypes.Method);
\r
35 return ((MethodInfo)accessors[0]).ToReflectionMethod();
\r
39 public static LazyMemberInfo ToLazyMember(this ReflectionMember reflectionMember)
\r
41 Assumes.NotNull(reflectionMember);
\r
43 if (reflectionMember.ItemType == ReflectionItemType.Property)
\r
45 ReflectionProperty reflectionProperty = reflectionMember as ReflectionProperty;
\r
46 Assumes.NotNull(reflectionProperty);
\r
48 MemberInfo[] accessors = new MemberInfo[] { reflectionProperty.UnderlyingGetMethod, reflectionProperty.UnderlyingSetMethod };
\r
49 return new LazyMemberInfo(MemberTypes.Property, accessors);
\r
53 return new LazyMemberInfo(reflectionMember.UnderlyingMember.MemberType, reflectionMember.UnderlyingMember);
\r
57 public static LazyMemberInfo ToLazyMember(this MemberInfo member)
\r
59 Assumes.NotNull(member);
\r
61 if (member.MemberType == MemberTypes.Property)
\r
63 PropertyInfo property = member as PropertyInfo;
\r
64 Assumes.NotNull(property);
\r
66 MemberInfo[] accessors = new MemberInfo[] { property.GetGetMethod(true), property.GetSetMethod(true)};
\r
67 return new LazyMemberInfo(MemberTypes.Property, accessors);
\r
71 return new LazyMemberInfo(member);
\r
75 public static ReflectionWritableMember ToReflectionWriteableMember(this LazyMemberInfo lazyMember)
\r
77 Assumes.IsTrue((lazyMember.MemberType == MemberTypes.Field) || (lazyMember.MemberType == MemberTypes.Property));
\r
79 ReflectionWritableMember reflectionMember = lazyMember.ToReflectionMember() as ReflectionWritableMember;
\r
80 Assumes.NotNull(reflectionMember);
\r
82 return reflectionMember;
\r
86 public static ReflectionProperty ToReflectionProperty(this PropertyInfo property)
\r
88 Assumes.NotNull(property);
\r
89 return CreateReflectionProperty(property.GetGetMethod(true), property.GetSetMethod(true));
\r
92 public static ReflectionProperty CreateReflectionProperty(MethodInfo getMethod, MethodInfo setMethod)
\r
94 Assumes.IsTrue(getMethod != null || setMethod != null);
\r
96 return new ReflectionProperty(getMethod, setMethod);
\r
99 public static ReflectionParameter ToReflectionParameter(this ParameterInfo parameter)
\r
101 Assumes.NotNull(parameter);
\r
102 return new ReflectionParameter(parameter);
\r
105 public static ReflectionMethod ToReflectionMethod(this MethodInfo method)
\r
107 Assumes.NotNull(method);
\r
108 return new ReflectionMethod(method);
\r
111 public static ReflectionField ToReflectionField(this FieldInfo field)
\r
113 Assumes.NotNull(field);
\r
114 return new ReflectionField(field);
\r
117 public static ReflectionType ToReflectionType(this Type type)
\r
119 Assumes.NotNull(type);
\r
120 return new ReflectionType(type);
\r
123 public static ReflectionWritableMember ToReflectionWritableMember(this MemberInfo member)
\r
125 Assumes.NotNull(member);
\r
126 if (member.MemberType == MemberTypes.Property)
\r
128 return ((PropertyInfo)member).ToReflectionProperty();
\r
131 return ((FieldInfo)member).ToReflectionField();
\r