private Dispatcher CreateGetter(MemberInfo member)
{
switch (member.MemberType)
{
case MemberTypes.Field:
{
FieldInfo field = (FieldInfo)member;
return
delegate(object o, object[] arguments) { return RuntimeServices.GetSlice(field.GetValue(o), "", arguments); };
}
case MemberTypes.Property:
{
MethodInfo getter = ((PropertyInfo) member).GetGetMethod(true);
if (null == getter) throw MissingField();
if (getter.GetParameters().Length > 0) return EmitMethodDispatcher(getter);
// TODO: remove the reflection invocation getter.Invoke from the path
// otherwise its a simple property and the slice
// should be applied to the return value
return
delegate(object o, object[] arguments) { return RuntimeServices.GetSlice(getter.Invoke(o, null), "", arguments); };
}
default:
{
throw MissingField();
}
}
}