1: public class DotNetAssemblyReflector : IAssemblyReflector
2: {
3: private Assembly _assmebly;
4:
5: public DotNetAssemblyReflector(Assembly assmebly)
6: {
7: _assmebly = assmebly;
8: }
9:
10: public virtual IEnumerable<IAttributeReflector> GetAttributes<T>() where T : Attribute
11: {
12: List<CustomAttributeData> returnValue = new List<CustomAttributeData>();
13: var pCustomAttributeType = typeof(T);
14:
15: foreach (CustomAttributeData customAttributeData in CustomAttributeData.GetCustomAttributes(_assmebly))
16: {
17: if (customAttributeData.Constructor.DeclaringType.Name == pCustomAttributeType.Name)
18: {
19: returnValue.Add(customAttributeData);
20: }
21: }
22:
23: return returnValue.Select(x => new DotNetAttributeReflector(x)).ToList();
24: }
25:
26: public string GetVersion()
27: {
28: string version = string.Empty;
29: var assemblyFileVersionCustomAttributeData = GetAttributes<AssemblyFileVersionAttribute>();
30: if (assemblyFileVersionCustomAttributeData.Count() == 1)
31: {
32: try
33: {
34: var assemblyFileVersion = assemblyFileVersionCustomAttributeData.First().Values;
35: version = assemblyFileVersion["version"];
36: }
37: catch (FormatException ex)
38: {
39: // // Console.WriteLine(String.Format("Problem getting the assembly version: {0}", assembly.FullName));
40: // // Console.WriteLine(ex);
41: }
42: }
43: return version;
44: }
45:
46: public IEnumerable<ITypeReflector> GetTypes()
47: {
48: return _assmebly.GetTypes().Select(t => new DotNetTypeReflector(t)).ToList();
49: }
50:
51: public string Location
52: {
53: get
54: {
55: return _assmebly.Location;
56: }
57: }
58:
59: public string FileName
60: {
61: get
62: {
63: return _assmebly.ManifestModule.Name;
64: }
65: }
66:
67: public string FullName
68: {
69: get
70: {
71: return _assmebly.FullName;
72: }
73: }
74: }
75:
76: public class DotNetTypeReflector : ITypeReflector
77: {
78: private Type _type;
79:
80: public DotNetTypeReflector(Type type)
81: {
82: _type = type;
83: }
84:
85: public IEnumerable<ITypeReflector> GetInterfaces()
86: {
87: return _type.GetInterfaces().Select(i => new DotNetTypeReflector(i)).ToList();
88: }
89:
90: public IEnumerable<IAttributeReflector> GetAttributes<T>() where T : Attribute
91: {
92: List<CustomAttributeData> returnValue = new List<CustomAttributeData>();
93: var pCustomAttributeType = typeof(T);
94:
95: foreach (CustomAttributeData customAttributeData in CustomAttributeData.GetCustomAttributes(_type))
96: {
97: if (customAttributeData.Constructor.DeclaringType.Name == pCustomAttributeType.Name)
98: {
99: returnValue.Add(customAttributeData);
100: }
101: }
102:
103: return returnValue.Select(a => new DotNetAttributeReflector(a)).ToList();
104: }
105:
106: public string FullName
107: {
108: get
109: {
110: return _type.FullName;
111: }
112: }
113:
114: public string Name
115: {
116: get
117: {
118: return _type.Name;
119: }
120: }
121: }
122:
123:
124: public class DotNetAttributeReflector : IAttributeReflector
125: {
126: private CustomAttributeData _attribute;
127: private IDictionary<string, string> _values;
128:
129: public IDictionary<string, string> Values
130: {
131: get
132: {
133: if (_values == null)
134: {
135: Dictionary<string, string> returnValue = new Dictionary<string, string>();
136: try
137: {
138: ParameterInfo[] ConstructorParameters = _attribute.Constructor.GetParameters();
139: for (int i = 0; i < ConstructorParameters.Length; i++)
140: {
141: returnValue.Add(ConstructorParameters[i].Name, _attribute.ConstructorArguments[i].Value.ToString());
142: }
143: }
144: catch (KeyNotFoundException ex)
145: {
146: // something is not matching up with constructor parameters and arguments
147: // this will be a FormatException for our purposes, so we will wrap and rethrow
148: throw;
149: }
150: foreach (CustomAttributeNamedArgument argument in _attribute.NamedArguments)
151: {
152: returnValue.Add(argument.MemberInfo.Name, argument.TypedValue.Value.ToString());
153: }
154: _values = returnValue;
155: }
156: return _values;
157: }
158: }
159:
160: public DotNetAttributeReflector(CustomAttributeData attribute)
161: {
162: _attribute = attribute;
163: }
164: }
165:
166: public class DotNetReflector : IReflector
167: {
168: public IAssemblyReflector LoadAssembly(string path)
169: {
170: return new DotNetAssemblyReflector(Assembly.LoadFrom(path));
171: }
172: }