@@ -29,6 +29,9 @@ THE SOFTWARE.
29
29
#if !NET45 && !NET451 && !NET452 && !NET46 && !NET461 && !NET462 && !NET47
30
30
#define SUPPORTS_EXPRESSION_COMPILE_WITH_PREFER_INTERPRETATION_PARAM
31
31
#endif
32
+ #if NET7_0_OR_GREATER
33
+ #define SUPPORTS_REQUIRED_PROPERTIES
34
+ #endif
32
35
33
36
namespace DryIoc
34
37
{
@@ -9271,10 +9274,19 @@ public PropertyOrFieldServiceInfo(Type serviceType) : base(serviceType) { }
9271
9274
/// <param name="holder">Holder of property or field.</param> <param name="value">Value to set.</param>
9272
9275
public abstract void SetValue(object holder, object value);
9273
9276
9274
- /// <summary>Create member info out of provide property or field .</summary>
9277
+ /// <summary>Create property or field service info out of provided member .</summary>
9275
9278
public static PropertyOrFieldServiceInfo Of(MemberInfo member) =>
9276
9279
member.ThrowIfNull() is PropertyInfo ? new Property((PropertyInfo)member) : (PropertyOrFieldServiceInfo)new Field((FieldInfo)member);
9277
9280
9281
+ /// <summary>Create property service info out of provided property.</summary>
9282
+ public static PropertyOrFieldServiceInfo Of(PropertyInfo property) => new Property(property);
9283
+
9284
+ /// <summary>Create property service info out of provided property with the details of `IfUnresolved.Throw`.</summary>
9285
+ public static PropertyOrFieldServiceInfo OfRequiredProperty(PropertyInfo property) => new Property.RequiredProperty(property);
9286
+
9287
+ /// <summary>Create field service info out of provided property.</summary>
9288
+ public static PropertyOrFieldServiceInfo Of(FieldInfo field) => new Field(field);
9289
+
9278
9290
private class Property : PropertyOrFieldServiceInfo
9279
9291
{
9280
9292
public override MemberInfo Member => _property;
@@ -9297,6 +9309,12 @@ private sealed class WithDetails : Property
9297
9309
public WithDetails(PropertyInfo property, ServiceDetails details) : base(property) => Details = details;
9298
9310
public WithDetails(PropertyInfo property, Type serviceType, ServiceDetails details) : base(property, serviceType) => Details = details;
9299
9311
}
9312
+
9313
+ internal sealed class RequiredProperty : Property
9314
+ {
9315
+ public override ServiceDetails Details => ServiceDetails.Default; // with IfUnresolved.Throw
9316
+ public RequiredProperty(PropertyInfo property) : base(property) {}
9317
+ }
9300
9318
}
9301
9319
9302
9320
private class Field : PropertyOrFieldServiceInfo
@@ -11276,6 +11294,35 @@ public static PropertiesAndFieldsSelector Properties(
11276
11294
IfUnresolved ifUnresolved = IfUnresolved.ReturnDefaultIfNotRegistered) =>
11277
11295
All(withNonPublic: withNonPublic, withPrimitive: false, withFields: false, withBase: withBase, ifUnresolved: ifUnresolved);
11278
11296
11297
+ #if SUPPORTS_REQUIRED_PROPERTIES
11298
+ /// <summary>The rule to discover and inject the `required properties` introduced in C# 11 and .NET 7.
11299
+ /// The properties are only injected if the constructor selected for the injection is NOT marked with `SetsRequiredMembers`,
11300
+ /// because it says the constuctor is reponsible for the setting of required properties.</summary>
11301
+ public static PropertiesAndFieldsSelector RequiredProperties() => _requiredProperties;
11302
+
11303
+ // We are keeping it as the field internally
11304
+ // and still using the public accessor method to be consistent with the rest of the PropertiesAndFields API.
11305
+ private static readonly PropertiesAndFieldsSelector _requiredProperties = req =>
11306
+ {
11307
+ var implType = req.ImplementationType;
11308
+ if (implType == null)
11309
+ return null;
11310
+
11311
+ var ctor = req.SelectedConstructor;
11312
+ if (ctor != null && ctor.GetCustomAttribute<SetsRequiredMembersAttribute>() != null)
11313
+ return null;
11314
+
11315
+ var props = implType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
11316
+ if (props.Length == 0)
11317
+ return null;
11318
+
11319
+ var requiredProps = props.Match(
11320
+ p => p.GetCustomAttribute<RequiredMemberAttribute>() != null,
11321
+ p => PropertyOrFieldServiceInfo.OfRequiredProperty(p));
11322
+ return requiredProps;
11323
+ };
11324
+ #endif
11325
+
11279
11326
/// <summary>Should return service info for input member (property or field).</summary>
11280
11327
public delegate PropertyOrFieldServiceInfo GetServiceInfo(MemberInfo member, Request request);
11281
11328
@@ -14836,9 +14883,9 @@ public static IEnumerable<TMember> GetMembers<TMember>(
14836
14883
{
14837
14884
var typeInfo = type.GetTypeInfo();
14838
14885
var members = getMembers(typeInfo);
14839
- if ( !includeBase || typeInfo.BaseType == null || typeInfo.BaseType == typeof(object) )
14840
- return members;
14841
- return members.Append(typeInfo.BaseType.GetMembers(getMembers, true));
14886
+ return !includeBase || typeInfo.BaseType == null || typeInfo.BaseType == typeof(object)
14887
+ ? members
14888
+ : members.Append(typeInfo.BaseType.GetMembers(getMembers, true));
14842
14889
}
14843
14890
14844
14891
/// <summary>Returns all public instance constructors for the type</summary>
0 commit comments