var inits = initializers.ToReadOnlyCollection ();
CheckForNull (inits, "initializers");
- switch (member.MemberType) {
- case MemberTypes.Field:
- CheckIsAssignableToIEnumerable ((member as FieldInfo).FieldType);
- break;
- case MemberTypes.Property:
- CheckIsAssignableToIEnumerable ((member as PropertyInfo).PropertyType);
- break;
- default:
- throw new ArgumentException ("member");
- }
+ member.OnFieldOrProperty (
+ field => CheckIsAssignableToIEnumerable (field.FieldType),
+ prop => CheckIsAssignableToIEnumerable (prop.PropertyType));
return new MemberListBinding (member, inits);
}
if (member == null)
throw new ArgumentNullException ("member");
- Type type = null;
- switch (member.MemberType) {
- case MemberTypes.Field:
- type = (member as FieldInfo).FieldType;
- break;
- case MemberTypes.Property:
- type = (member as PropertyInfo).PropertyType;
- break;
- default:
- throw new ArgumentException ("Member is neither a field or a property");
- }
+ var type = member.OnFieldOrProperty (
+ field => field.FieldType,
+ prop => prop.PropertyType);
return new MemberMemberBinding (member, CheckMemberBindings (type, bindings));
}
{
var member = this.Member;
- switch (member.MemberType) {
- case MemberTypes.Field:
- EmitFieldAssignment (ec, (FieldInfo) member, local);
- return;
- case MemberTypes.Property:
- EmitPropertyAssignment (ec, (PropertyInfo) member, local);
- return;
- default:
- throw new NotSupportedException (member.MemberType.ToString ());
- }
+ this.Member.OnFieldOrProperty (
+ field => EmitFieldAssignment (ec, field, local),
+ prop => EmitPropertyAssignment (ec, prop, local));
}
void EmitFieldAssignment (EmitContext ec, FieldInfo field, LocalBuilder local)
{
ec.EmitLoad (local);
- switch (member.MemberType) {
- case MemberTypes.Property:
- return EmitLoadProperty (ec, (PropertyInfo) member);
- case MemberTypes.Field:
- return EmitLoadField (ec, (FieldInfo) member);
- default:
- throw new NotSupportedException (member.MemberType.ToString ());
- }
+ return member.OnFieldOrProperty<LocalBuilder> (
+ field => EmitLoadField (ec, field),
+ prop => EmitLoadProperty (ec, prop));
}
LocalBuilder EmitLoadProperty (EmitContext ec, PropertyInfo property)