The point here is to demonstrate how light such a code can be. In his current state the code suffers some defaults discussed at the end.
A template is a String comprising tokens of the form [ProperyName] or [ProperyName:format]. PropertyName can be any name of any property of an object or navigable property of the object. However IEnumerable are not handled.
public static String MergeObjectFromTemplate(String st, Object o) {
if (String.IsNullOrEmpty(st)) throw new ArgumentNullException("st");
if (o == null) return st;
Int32 i = st.IndexOf("[");
Int32 j = 0;
String pName;
Object lo;
String[] a;
while (i >= 0) {
j = st.IndexOf("]");
if (j == -1)
return st;
pName = st.Substring(i + 1, j - i - 1);
a = pName.Split(':');
lo = GetObjectByReflection(o, a[0]);
if (lo == null) {
st = st.Replace("[" + pName + "]", "_" + pName + "_");
} else {
if (a.Count() == 1) {
st = st.Replace("[" + pName + "]", lo.ToString().Trim());
} else {
st = st.Replace("[" + pName + "]", String.Format("{0:" + a[1] + "}", lo));
}
}
i = st.IndexOf("[");
}
return st;
}
The key function here is: GetObjectByReflection.public static Object GetObjectByReflection(Object src, String propertyName) {
Type type;
Object o = src;
foreach (String fragment in propertyName.Split('.')) {
type = o.GetType();
PropertyInfo pi = type.GetProperty(fragment);
if (pi == null) {
o = null;
break;
}
o = pi.GetValue(o, null);
if (o == null) return String.Empty;
}
return o;
}
That is it!Well, not totally. It remains some defaults, but for 50 lines, that's may be not so bad. Known defaults are:
- Bad format string are not handled.
- This is blocking, if throwing an exception is blocking. Correcting it is easy once expected behavior is known. At the time the code was updated I was just needing to format DateTime in a relatively safe environment: templates are edited by me. It is another story if you want to allow user to produce templates.
- Excepted for a bad format String, the code always returns a String, even if a bad object is provided, or bad property name is used.
Aucun commentaire:
Enregistrer un commentaire