3 using System.Collections.Generic;
4 using System.Reflection;
10 protected internal readonly IDictionary<string, Type> predicateClass =
new Dictionary<string, Type>();
11 protected internal readonly IDictionary<Type, IDictionary<string, MethodInfo>> classSetterMethod =
new Dictionary<Type, IDictionary<string, MethodInfo>>();
13 protected internal abstract string GetActualString(
string predicate, Dictionary<int, object> parametersMap);
15 public virtual Type GetClass(
string predicate)
17 if (predicateClass.ContainsKey(predicate))
18 return predicateClass[predicate];
22 public virtual object GetObject(
string @
string)
24 string predicate = GetId(@
string);
25 if (predicate is
null)
29 Type cl = GetClass(predicate);
33 string[] parameters = GetParam(@
string);
34 if (parameters ==
null)
37 object obj = System.Activator.CreateInstance(cl);
38 PopulateObject(cl, parameters, obj);
42 protected internal abstract string GetId(
string @
string);
44 protected internal abstract string[] GetParam(
string @
string);
46 public virtual string GetString(
object obj)
48 string predicate = RegisterClass(obj.GetType());
50 Dictionary<int, object> parametersMap =
new Dictionary<int, object>();
51 foreach (FieldInfo field
in obj.GetType().GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
58 if (Attribute.IsDefined(field, typeof(
Param)))
60 string nameMethod =
"get" +
char.ToUpper(field.Name[0]) + field.Name.Substring(1);
61 object value = obj.GetType().GetMethod(nameMethod).Invoke(obj,
new object[] { });
63 var attr = field.GetCustomAttribute(typeof(
Param));
65 parametersMap[pAttr.value] = value;
68 return GetActualString(predicate, parametersMap);
71 private void PopulateObject(Type cl,
string[] parameters,
object obj)
73 foreach (FieldInfo field
in cl.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
75 if (Attribute.IsDefined(field, typeof(
Param)))
77 var attr = field.GetCustomAttribute(typeof(
Param));
79 int term = pAttr.value;
80 string nameMethod =
"set" +
char.ToUpper(field.Name[0]) + field.Name.Substring(1);
81 MethodBase method = classSetterMethod[cl][nameMethod];
83 if (method.GetParameters()[0].ParameterType.ToString().Equals(typeof(
int).FullName))
84 method.Invoke(obj,
new object[] { Convert.ToInt32(parameters[term]) });
85 else if (method.GetParameters()[0].ParameterType.ToString().Equals(typeof(
SymbolicConstant).FullName))
88 method.Invoke(obj,
new object[] { parameters[term] });
93 public virtual string RegisterClass(Type cl)
95 Attribute annotation = cl.GetCustomAttribute(typeof(
Id));
96 if (annotation ==
null)
99 string predicate = ((
Id)annotation).value;
100 if (predicate.Contains(
" "))
103 predicateClass[predicate] = cl;
104 IDictionary<string, MethodInfo> namesMethods =
new Dictionary<string, MethodInfo>();
105 foreach (MethodInfo method
in cl.GetMethods())
106 if (method.Name.StartsWith(
"set"))
107 namesMethods[method.Name] = method;
108 classSetterMethod[cl] = namesMethods;
112 public virtual void UnregisterClass(Type cl)
114 Attribute annotation = cl.GetCustomAttribute(typeof(
Id));
115 if (annotation ==
null)
118 string predicate = ((
Id)annotation).value;
119 predicateClass.Remove(predicate);
120 classSetterMethod.Remove(cl);