Skip to content

Commit

Permalink
fix nested EnableNonPublicMember, fix TwoWays IncludeMember
Browse files Browse the repository at this point in the history
  • Loading branch information
chaowlert committed Mar 2, 2020
1 parent adf6c17 commit e2fd308
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 40 deletions.
2 changes: 1 addition & 1 deletion src/Mapster/Adapters/BaseClassAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ protected virtual ClassModel GetSetterModel(CompileArgument arg)
{
return new ClassModel
{
Members = arg.DestinationType.GetFieldsAndProperties(false, accessorFlags: BindingFlags.NonPublic | BindingFlags.Public)
Members = arg.DestinationType.GetFieldsAndProperties(true)
};
}

Expand Down
2 changes: 1 addition & 1 deletion src/Mapster/Adapters/DictionaryAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ protected override ClassModel GetSetterModel(CompileArgument arg)
if (arg.SourceType.GetDictionaryType() == null)
{
var srcNames = arg.GetSourceNames();
var propNames = arg.SourceType.GetFieldsAndProperties(accessorFlags: BindingFlags.NonPublic | BindingFlags.Public)
var propNames = arg.SourceType.GetFieldsAndProperties(true)
.Where(model => model.ShouldMapMember(arg, MemberSide.Source))
.Select(model => model.Name)
.Where(name => !srcNames.Contains(name))
Expand Down
1 change: 1 addition & 0 deletions src/Mapster/Enums/AccessModifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public enum AccessModifier
Protected = 2,
Internal = 4,
ProtectedInternal = 6,
NonPublic = 7,
Public = 8,
}
}
2 changes: 1 addition & 1 deletion src/Mapster/Settings/ShouldMapMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Mapster
{
public static class ShouldMapMember
{
public static readonly Func<IMemberModel, MemberSide, bool?> AllowNonPublic = (model, _) => model.AccessModifier != AccessModifier.None;
public static readonly Func<IMemberModel, MemberSide, bool?> AllowNonPublic = (model, _) => (model.AccessModifier & AccessModifier.NonPublic) != 0 ? (bool?)true : null;
public static readonly Func<IMemberModel, MemberSide, bool?> AllowPublic = (model, _) => model.AccessModifier == AccessModifier.Public ? (bool?)true : null;
public static readonly Func<IMemberModel, MemberSide, bool?> IgnoreAdaptIgnore = (model, side) =>
{
Expand Down
8 changes: 4 additions & 4 deletions src/Mapster/Settings/ValueAccessingStrategy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public static class ValueAccessingStrategy

private static Expression? PropertyOrFieldFn(Expression source, IMemberModel destinationMember, CompileArgument arg)
{
var members = source.Type.GetFieldsAndProperties(accessorFlags: BindingFlags.NonPublic | BindingFlags.Public);
var members = source.Type.GetFieldsAndProperties(true);
var strategy = arg.Settings.NameMatchingStrategy;
var destinationMemberName = destinationMember.GetMemberName(arg.Settings.GetMemberNames, strategy.DestinationMemberNameConverter);
return members
Expand Down Expand Up @@ -104,7 +104,7 @@ public static class ValueAccessingStrategy
private static Expression? GetDeepFlattening(Expression source, string propertyName, CompileArgument arg)
{
var strategy = arg.Settings.NameMatchingStrategy;
var members = source.Type.GetFieldsAndProperties(accessorFlags: BindingFlags.NonPublic | BindingFlags.Public);
var members = source.Type.GetFieldsAndProperties(true);
foreach (var member in members)
{
if (!member.ShouldMapMember(arg, MemberSide.Source))
Expand All @@ -131,7 +131,7 @@ internal static IEnumerable<InvokerModel> FindUnflatteningPairs(Expression sourc
{
var strategy = arg.Settings.NameMatchingStrategy;
var destinationMemberName = destinationMember.GetMemberName(arg.Settings.GetMemberNames, strategy.DestinationMemberNameConverter);
var members = source.Type.GetFieldsAndProperties(accessorFlags: BindingFlags.NonPublic | BindingFlags.Public);
var members = source.Type.GetFieldsAndProperties(true);

foreach (var member in members)
{
Expand All @@ -154,7 +154,7 @@ internal static IEnumerable<InvokerModel> FindUnflatteningPairs(Expression sourc
private static IEnumerable<string> GetDeepUnflattening(IMemberModel destinationMember, string propertyName, CompileArgument arg)
{
var strategy = arg.Settings.NameMatchingStrategy;
var members = destinationMember.Type.GetFieldsAndProperties(accessorFlags: BindingFlags.NonPublic | BindingFlags.Public);
var members = destinationMember.Type.GetFieldsAndProperties(true);
foreach (var member in members)
{
if (!member.ShouldMapMember(arg, MemberSide.Destination))
Expand Down
14 changes: 2 additions & 12 deletions src/Mapster/TypeAdapterSetter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,17 +175,7 @@ public static class TypeAdapterSetterExtensions
{
setter.CheckCompiled();

if (value)
{
setter.Settings.ShouldMapMember.Remove(ShouldMapMember.AllowPublic);
setter.Settings.ShouldMapMember.Add(ShouldMapMember.AllowNonPublic);
}
else
{
setter.Settings.ShouldMapMember.Remove(ShouldMapMember.AllowNonPublic);
setter.Settings.ShouldMapMember.Add(ShouldMapMember.AllowPublic);
}

setter.Settings.EnableNonPublicMembers = value;
return setter;
}

Expand Down Expand Up @@ -690,7 +680,7 @@ public TwoWaysTypeAdapterSetter(TypeAdapterConfig config)
public TwoWaysTypeAdapterSetter<TSource, TDestination> IncludeMember(Func<IMemberModel, MemberSide, bool> predicate)
{
SourceToDestinationSetter.IncludeMember(predicate);
DestinationToSourceSetter.IgnoreMember((model, side) => predicate(model, side == MemberSide.Source ? MemberSide.Destination : MemberSide.Source));
DestinationToSourceSetter.IncludeMember((model, side) => predicate(model, side == MemberSide.Source ? MemberSide.Destination : MemberSide.Source));
return this;
}

Expand Down
5 changes: 5 additions & 0 deletions src/Mapster/TypeAdapterSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ public NameMatchingStrategy NameMatchingStrategy
get => Get("SkipDestinationMemberCheck");
set => Set("SkipDestinationMemberCheck", value);
}
public bool? EnableNonPublicMembers
{
get => Get("EnableNonPublicMembers");
set => Set("EnableNonPublicMembers", value);
}

public List<Func<IMemberModel, MemberSide, bool?>> ShouldMapMember
{
Expand Down
42 changes: 21 additions & 21 deletions src/Mapster/Utils/ReflectionUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,35 +77,29 @@ public static bool IsPoco(this Type type)
if (type.IsConvertible())
return false;

return type.GetFieldsAndProperties(requireSetter: true).Any();
return type.GetFieldsAndProperties().Any(it => (it.SetterModifier & (AccessModifier.Public | AccessModifier.NonPublic)) != 0);
}

public static IEnumerable<IMemberModelEx> GetFieldsAndProperties(this Type type,
bool requireSetter = false,
BindingFlags accessorFlags = BindingFlags.Public)
public static IEnumerable<IMemberModelEx> GetFieldsAndProperties(this Type type, bool includeNonPublic = false)
{
var bindingFlags = BindingFlags.Instance | accessorFlags;
var bindingFlags = BindingFlags.Instance | BindingFlags.Public;
if (includeNonPublic)
bindingFlags |= BindingFlags.NonPublic;

if (type.GetTypeInfo().IsInterface)
{
var allInterfaces = GetAllInterfaces(type);
return allInterfaces.SelectMany(GetPropertiesFunc);
}

IEnumerable<IMemberModelEx> getPropertiesFunc(Type t) => t.GetProperties(bindingFlags)
return GetPropertiesFunc(type).Concat(GetFieldsFunc(type));

IEnumerable<IMemberModelEx> GetPropertiesFunc(Type t) => t.GetProperties(bindingFlags)
.Where(x => x.GetIndexParameters().Length == 0)
.Where(x => !requireSetter || x.CanWrite)
.Select(CreateModel);

IEnumerable<IMemberModelEx> getFieldsFunc(Type t) => t.GetFields(bindingFlags)
.Where(x => !requireSetter || !x.IsInitOnly)
IEnumerable<IMemberModelEx> GetFieldsFunc(Type t) => t.GetFields(bindingFlags)
.Select(CreateModel);

if (type.GetTypeInfo().IsInterface)
{
var allInterfaces = GetAllInterfaces(type);
return allInterfaces.SelectMany(getPropertiesFunc);
}
else
{
var properties = getPropertiesFunc(type);
var fields = getFieldsFunc(type);
return properties.Concat(fields);
}
}

// GetProperties(), GetFields(), GetMethods() do not return properties/methods from parent interfaces,
Expand Down Expand Up @@ -311,6 +305,12 @@ public static bool ShouldMapMember(this IMemberModel member, CompileArgument arg
.FirstOrDefault(it => it != null);
if (result != null)
return result == true;
if (arg.Settings.EnableNonPublicMembers == true)
{
result = Mapster.ShouldMapMember.AllowNonPublic(member, side);
if (result != null)
return result == true;
}
var names = side == MemberSide.Destination ? arg.GetDestinationNames() : arg.GetSourceNames();
return names.Contains(member.Name);
}
Expand Down

0 comments on commit e2fd308

Please sign in to comment.