private static void EmiFieldOrPropertyCopyIL(ILGenerator generator, MethodInfo deepCopyMethod, FieldOrPropertyInfo member) { Debug.Assert(member.MemberInfo is FieldInfo || member.MemberInfo is PropertyInfo, "Field or property expected"); if (member.ValueType.IsValueType || member.IsDefined(typeof(ShallowCopyAttribute), false)) { // shallow copy - copy value by simple assignment generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_0); if (member.MemberInfo is FieldInfo) { var field = (FieldInfo)member.MemberInfo; generator.Emit(OpCodes.Ldfld, field); generator.Emit(OpCodes.Stfld, field); } else { var property = (PropertyInfo)member.MemberInfo; generator.Emit(OpCodes.Call, property.GetGetMethod()); generator.Emit(OpCodes.Call, property.GetSetMethod()); } } else { // deep copy - call special method for obtaining a deep copy generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_0); if (member.MemberInfo is FieldInfo) generator.Emit(OpCodes.Ldfld, (FieldInfo)member.MemberInfo); else generator.Emit(OpCodes.Call, ((PropertyInfo)member.MemberInfo).GetGetMethod()); generator.Emit(OpCodes.Call, deepCopyMethod); if (member.MemberInfo is FieldInfo) generator.Emit(OpCodes.Stfld, (FieldInfo)member.MemberInfo); else generator.Emit(OpCodes.Call, ((PropertyInfo)member.MemberInfo).GetSetMethod()); } }
private static Type GetLimitationAttribute(FieldOrPropertyInfo member, Type limitationAttribute) { var limitationSwitchAttribute = (LimitationSwitchAttribute)Attribute.GetCustomAttribute(member.MemberInfo, typeof(LimitationSwitchAttribute)); if (limitationSwitchAttribute != null && limitationSwitchAttribute.From == limitationAttribute) return limitationSwitchAttribute.To; return limitationAttribute; }
private static IEnumerable<Attribute> GetAttributes(FieldOrPropertyInfo member) { if (GetPropertyAttributes != null) foreach (var attr in GetPropertyAttributes(member)) yield return attr; yield return new CategoryAttribute(member.DeclaringType.Name); foreach (var attr in member.GetCustomAttributes(false).Cast<Attribute>()) yield return attr; }
public static string GetSerializedName(FieldOrPropertyInfo member) { var serializedNameAttribute = (SerializedNameAttribute)Attribute.GetCustomAttribute(member.MemberInfo, typeof(SerializedNameAttribute)); var name = new StringBuilder(serializedNameAttribute != null ? serializedNameAttribute.SerializedName : member.Name); if (name[0] == '_') name.Remove(0, 1); name[0] = char.ToLower(name[0]); return name.ToString(); }
public GobPropertyDescriptor(FieldOrPropertyInfo field) : base(BeautifyFieldName(field.Name), GetAttributes(field).ToArray()) { _member = field; }