/// <summary> Creates a C# automatic property (i.e. `public bool X { get; }` or `public string Y { get; set; }`). Returns the property and its backing field. </summary> public static (FieldDef, PropertyDef) CreateAutoProperty(TypeSignature declType, string name, TypeReference propertyType, Accessibility accessibility = null, bool isReadOnly = true, bool isStatic = false, XmlComment doccomment = null) { accessibility = accessibility ?? Accessibility.APublic; var field = new FieldSignature(declType, string.Format(AutoPropertyField, name), Accessibility.APrivate, propertyType, isStatic, isReadOnly); var fieldRef = field.SpecializeFromDeclaringType(); var prop = PropertySignature.Create(name, declType, propertyType, accessibility, isReadOnly ? null : accessibility, isStatic); var getter = MethodDef.CreateWithArray(prop.Getter, thisP => Expression.FieldAccess(fieldRef, thisP.SingleOrDefault()).Dereference()); // getter.Attributes.Add(declaringType.Compilation.CompilerGeneratedAttribute()); var setter = isReadOnly ? null : MethodDef.CreateWithArray(prop.Setter, args => Expression.FieldAccess(fieldRef, args.Length == 1 ? null : args[0].Ref()).ReferenceAssign(args.Last())); return(new FieldDef(field), new PropertyDef(prop, getter, setter).With(doccomment: doccomment)); }
/// <summary> Creates a PropertySignature of a property represented by System.Reflection type </summary> public static PropertySignature FromReflection(R.PropertyInfo prop) { prop = MethodSignature.SanitizeDeclaringTypeGenerics(prop); var declaringType = TypeSignature.FromType(prop.DeclaringType); var get = prop.GetMethod?.Apply(MethodSignature.FromReflection); var set = prop.SetMethod?.Apply(MethodSignature.FromReflection); var m = get ?? set; var resultType = TypeReference.FromType(prop.PropertyType); return(PropertySignature.Create(prop.Name, declaringType, resultType, get?.Accessibility, set?.Accessibility, m.IsStatic, m.IsVirtual, m.IsOverride, m.IsAbstract)); }