Skip to content
Merged
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
696899d
ProjectTo runtime polymorphic mapping with Include/IncludeBase
lbargaoanu Apr 14, 2023
810d2b9
added tests
JanEggers Apr 14, 2023
a71a797
only consider polymorphic maps
lbargaoanu Apr 15, 2023
24ac20a
retry by hand
lbargaoanu Apr 17, 2023
3262888
consider each source type once
lbargaoanu Apr 17, 2023
7794318
cosmetic
lbargaoanu Apr 20, 2023
5d8d84e
Fix ReverseMap destination validation issue
killergege Apr 21, 2023
03552e3
Prevent init of default when not necessary
killergege Apr 24, 2023
f517414
Test for Details init
killergege Apr 24, 2023
97a3e0e
Move details test
killergege Apr 24, 2023
9cf7a55
allow recursive struct destinations
lbargaoanu Apr 26, 2023
77a082b
null check when chaining included members
lbargaoanu Jun 9, 2023
9d78365
Add reproduction test
Jun 14, 2023
9f030a8
If the destination type of the projection is abstract use the default…
Jun 14, 2023
65bfcea
Add integration test.
Jun 15, 2023
48fd7b3
exclude included abstract types
lbargaoanu Jun 16, 2023
dab92b1
Merge pull request #4304 from kvpt/basic_include_abstract
lbargaoanu Jun 16, 2023
a3fcd6a
Initial attempt to solve constructor mappings inheritance
rubengonzalezlodeiro Jun 26, 2023
7cb8580
Fix test
rubengonzalezlodeiro Jun 27, 2023
4473bf5
Changed implementation to be more like ApplyIncludedMember
rubengonzalezlodeiro Jul 1, 2023
75a5958
More PR feedback plus solving mapping not really working
rubengonzalezlodeiro Jul 2, 2023
6792e53
CanConstruct.ShouldBeFalse()
lbargaoanu Jul 3, 2023
d5edfd1
cosmetic
lbargaoanu Jul 3, 2023
8252b63
Merge pull request #4314 from rubengonzalezlodeiro/constructor_mappin…
lbargaoanu Jul 3, 2023
fcac03b
code reuse
lbargaoanu Jul 15, 2023
a5d9bd5
Add integration test case.
Jul 19, 2023
43be6cc
Adjustments
Jul 19, 2023
97d6d5d
Merge pull request #4320 from kvpt/polymorphic_include_issue
lbargaoanu Jul 19, 2023
c5c3fb1
check for included types whenever we use a map, except for the let cl…
lbargaoanu Jul 19, 2023
897cf05
cosmetic
lbargaoanu Jul 19, 2023
d08927c
rename the DI tests folder
lbargaoanu Jul 29, 2023
0301f0b
cosmetic
lbargaoanu Jul 30, 2023
dd6b4ce
add options to disable and override ExplicitExpansion
Angelinsky7 Aug 3, 2023
7dfb089
rename field
Angelinsky7 Aug 3, 2023
339d86b
add inheritance test
Angelinsky7 Aug 3, 2023
bba6731
add constructor test
Angelinsky7 Aug 3, 2023
eed5dfb
bumb: restore compat baseline
Angelinsky7 Aug 3, 2023
bc835bf
remove override and corrected test
Angelinsky7 Aug 4, 2023
389b22b
Delete SqlLocalDB.msi
Angelinsky7 Aug 4, 2023
328308b
Delete SqlLocalDBInstall.log
Angelinsky7 Aug 4, 2023
70b8ede
ObjectPropertyAndNestedTypes
lbargaoanu Aug 4, 2023
affeed4
test: add constructor mapping with inheritance
Angelinsky7 Aug 21, 2023
0b9fbce
remove the ad-hoc stuff
lbargaoanu Aug 21, 2023
2d8af82
Merge pull request #4327 from Angelinsky7/disable_explicit_expansion
lbargaoanu Aug 21, 2023
453bb7a
add 13.0-Upgrade-Guide in the index
lbargaoanu Aug 25, 2023
dfd8469
Map returns the source object when the AssignableMapper applies
lbargaoanu Sep 2, 2023
0db9ff6
Context.State similar to Context.Items
lbargaoanu Sep 20, 2023
436ea14
cosmetic
lbargaoanu Oct 1, 2023
86b7a64
ArgumentNullException.ThrowIfNull
lbargaoanu Oct 2, 2023
78b0308
seal classes
lbargaoanu Oct 2, 2023
5b76e58
renames
lbargaoanu Oct 22, 2023
b09f9b1
avoid user implementations for GetHashCode and Equals when checking r…
lbargaoanu Oct 28, 2023
330e7f9
.net 8
lbargaoanu Nov 18, 2023
c678714
upgrade EF
lbargaoanu Nov 20, 2023
4a2f620
upgrade packages
lbargaoanu Nov 20, 2023
5934526
allow mapping to IReadOnlySet
lbargaoanu Dec 7, 2023
4c8207c
cosmetic
lbargaoanu Dec 12, 2023
340b298
report unknown collection types at map time
lbargaoanu Dec 21, 2023
99be09f
keep looking for matching maps, even when we cached a negative match
lbargaoanu Jan 23, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AutoMapper.sln
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.UnitTests", "src
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.IntegrationTests", "src\IntegrationTests\AutoMapper.IntegrationTests.csproj", "{24B47F4C-0035-4F29-AAD9-4C47E1AAD98E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.DI.Tests", "src\AutoMapper.Extensions.Microsoft.DependencyInjection.Tests\AutoMapper.DI.Tests.csproj", "{BEBD620A-8BAA-463F-BE0F-8319AD3C1644}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.DI.Tests", "src\AutoMapper.DI.Tests\AutoMapper.DI.Tests.csproj", "{BEBD620A-8BAA-463F-BE0F-8319AD3C1644}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApp", "src\TestApp\TestApp.csproj", "{35CED3AE-B825-4703-992D-A58B5BE646DC}"
EndProject
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ AutoMapper is a simple little library built to solve a deceptively complex probl

This is the main repository for AutoMapper, but there's more:

* [Microsoft DI Extensions](https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection)
* [Collection Extensions](https://github.com/AutoMapper/AutoMapper.Collection)
* [Expression Mapping](https://github.com/AutoMapper/AutoMapper.Extensions.ExpressionMapping)
* [EF6 Extensions](https://github.com/AutoMapper/AutoMapper.EF6)
Expand Down
6 changes: 5 additions & 1 deletion docs/13.0-Upgrade-Guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@ Besides the build-time impact, there is also a behaviour change. Non-generic `Ma

## `AllowAdditiveTypeMapCreation` was removed

Be sure to call `CreateMap` once for a source type, destination type pair. If you want to reuse configuration, use mapping inheritance.
Be sure to call `CreateMap` once for a source type, destination type pair. If you want to reuse configuration, use mapping inheritance.

## ProjectTo runtime polymorphic mapping with Include/IncludeBase

We consider this an off the beaten path feature and we don't expose it through `CreateProjection`. You can use [an extension method](https://github.com/AutoMapper/AutoMapper/search?l=C%23&q=Advanced) or `CreateMap`.
4 changes: 2 additions & 2 deletions docs/Queryable-Extensions.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ Not all mapping options can be supported, as the expression generated must be in
* NullSubstitute
* Value transformers
* IncludeMembers
* Runtime polymorphic mapping with Include/IncludeBase

Not supported:
* Condition
Expand All @@ -237,6 +238,5 @@ Not supported:
* Custom resolvers
* Custom type converters
* ForPath
* Value converters
* Runtime polymorphic mapping with Include/IncludeBase
* Value converters
* **Any calculated property on your domain object**
8 changes: 6 additions & 2 deletions src/AutoMapper/ApiCompatBaseline.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMappe
InterfacesShouldHaveSameMembers : Interface member 'public System.Collections.Generic.IReadOnlyCollection<AutoMapper.PropertyMapAction> AutoMapper.IProfileConfiguration.AllPropertyMapActions.get()' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public System.Collections.Generic.IReadOnlyCollection<System.Action<AutoMapper.PropertyMap, AutoMapper.IMemberConfigurationExpression>> AutoMapper.IProfileConfiguration.AllPropertyMapActions.get()' is present in the contract but not in the implementation.
MembersMustExist : Member 'public System.Collections.Generic.IReadOnlyCollection<System.Action<AutoMapper.PropertyMap, AutoMapper.IMemberConfigurationExpression>> AutoMapper.IProfileConfiguration.AllPropertyMapActions.get()' does not exist in the implementation but it does exist in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void AutoMapper.Configuration.ICtorParamConfigurationExpression.ExplicitExpansion()' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void AutoMapper.IProjectionMemberConfiguration<TSource, TDestination, TMember>.ExplicitExpansion()' is present in the contract but not in the implementation.
MembersMustExist : Member 'public void AutoMapper.IProjectionMemberConfiguration<TSource, TDestination, TMember>.ExplicitExpansion()' does not exist in the implementation but it does exist in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void AutoMapper.IProjectionMemberConfiguration<TSource, TDestination, TMember>.ExplicitExpansion(System.Boolean)' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void AutoMapper.Configuration.ICtorParamConfigurationExpression.ExplicitExpansion(System.Boolean)' is present in the implementation but not in the contract.
MembersMustExist : Member 'public void AutoMapper.Configuration.MemberConfigurationExpression<TSource, TDestination, TMember>.ExplicitExpansion()' does not exist in the implementation but it does exist in the contract.
CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMapper.Configuration.Annotations.IgnoreAttribute' changed from '[AttributeUsageAttribute(384)]' in the contract to '[AttributeUsageAttribute(AttributeTargets.Field | AttributeTargets.Property)]' in the implementation.
CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMapper.Configuration.Annotations.MapAtRuntimeAttribute' changed from '[AttributeUsageAttribute(384)]' in the contract to '[AttributeUsageAttribute(AttributeTargets.Field | AttributeTargets.Property)]' in the implementation.
CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMapper.Configuration.Annotations.MappingOrderAttribute' changed from '[AttributeUsageAttribute(384)]' in the contract to '[AttributeUsageAttribute(AttributeTargets.Field | AttributeTargets.Property)]' in the implementation.
Expand All @@ -13,4 +17,4 @@ CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMappe
CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMapper.Configuration.Annotations.ValueConverterAttribute' changed from '[AttributeUsageAttribute(384)]' in the contract to '[AttributeUsageAttribute(AttributeTargets.Field | AttributeTargets.Property)]' in the implementation.
CannotChangeAttribute : Attribute 'System.AttributeUsageAttribute' on 'AutoMapper.Configuration.Annotations.ValueResolverAttribute' changed from '[AttributeUsageAttribute(384)]' in the contract to '[AttributeUsageAttribute(AttributeTargets.Field | AttributeTargets.Property)]' in the implementation.
TypeCannotChangeClassification : Type 'AutoMapper.Execution.TypeMapPlanBuilder' is a 'ref struct' in the implementation but is a 'struct' in the contract.
Total Issues: 14
Total Issues: 18
2 changes: 1 addition & 1 deletion src/AutoMapper/Configuration/ConfigurationValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private void CheckPropertyMaps(IGlobalConfiguration config, HashSet<TypeMap> typ
// when we don't know what the source type is, bail
if (sourceType.IsGenericParameter || sourceType == typeof(object))
{
return;
continue;
}
DryRunTypeMap(config, typeMapsChecked, new(sourceType, memberMap.DestinationType), null, memberMap);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System.Runtime.CompilerServices;
namespace AutoMapper.Configuration;

namespace AutoMapper.Configuration;
public interface ICtorParamConfigurationExpression
{
/// <summary>
Expand All @@ -11,7 +9,8 @@ public interface ICtorParamConfigurationExpression
/// <summary>
/// Ignore this member for LINQ projections unless explicitly expanded during projection
/// </summary>
void ExplicitExpansion();
/// <param name="value">Is explicitExpansion active</param>
void ExplicitExpansion(bool value = true);
}
public interface ICtorParamConfigurationExpression<TSource> : ICtorParamConfigurationExpression
{
Expand Down Expand Up @@ -63,7 +62,7 @@ public void MapFrom(string sourceMembersPath)
_ctorParamActions.Add(cpm => cpm.MapFrom(sourceMembersPath, sourceMembers));
}

public void ExplicitExpansion() => _ctorParamActions.Add(cpm => cpm.ExplicitExpansion = true);
public void ExplicitExpansion(bool value) => _ctorParamActions.Add(cpm => cpm.ExplicitExpansion = value);

public void Configure(TypeMap typeMap)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,8 @@ public interface IProjectionMemberConfiguration<TSource, TDestination, TMember>
/// <summary>
/// Ignore this member for LINQ projections unless explicitly expanded during projection
/// </summary>
void ExplicitExpansion();
/// <param name="value">Is explicitExpansion active</param>
void ExplicitExpansion(bool value = true);
/// <summary>
/// Apply a transformation function after any resolved destination member value with the given type
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ private void PreConditionCore(Expression<Func<TSource, TDestination, ResolutionC
PropertyMapActions.Add(pm => pm.PreCondition = expr);
public void AddTransform(Expression<Func<TMember, TMember>> transformer) =>
PropertyMapActions.Add(pm => pm.AddValueTransformation(new ValueTransformerConfiguration(pm.DestinationType, transformer)));
public void ExplicitExpansion() => PropertyMapActions.Add(pm => pm.ExplicitExpansion = true);
public void ExplicitExpansion(bool value) => PropertyMapActions.Add(pm => pm.ExplicitExpansion = value);
public void Ignore() => Ignore(ignorePaths: true);
public void Ignore(bool ignorePaths)
{
Expand Down
49 changes: 28 additions & 21 deletions src/AutoMapper/ConstructorMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ public bool CanResolve
get => _canResolve ??= ParametersCanResolve();
set => _canResolve = value;
}
private bool ParametersCanResolve()
bool ParametersCanResolve()
{
foreach (var param in _ctorParams)
{
if (!param.CanResolveValue)
if (!param.IsMapped)
{
return false;
}
Expand All @@ -42,29 +42,26 @@ public ConstructorParameterMap this[string name]
return null;
}
}
public void AddParameter(ParameterInfo parameter, IEnumerable<MemberInfo> sourceMembers, TypeMap typeMap) =>
_ctorParams.Add(new(typeMap, parameter, sourceMembers.ToArray()));
public bool ApplyIncludedMember(IncludedMember includedMember)
public void AddParameter(ParameterInfo parameter, IEnumerable<MemberInfo> sourceMembers, TypeMap typeMap) => _ctorParams.Add(new(typeMap, parameter, sourceMembers.ToArray()));
public bool ApplyMap(TypeMap typeMap, IncludedMember includedMember = null)
{
var includedMap = includedMember.TypeMap.ConstructorMap;
if (CanResolve || includedMap?.Ctor != Ctor)
var constructorMap = typeMap.ConstructorMap;
if(constructorMap == null)
{
return false;
}
bool canResolve = false;
var includedParams = includedMap._ctorParams;
for(int index = 0; index < includedParams.Count; index++)
bool applied = false;
foreach(var parameterMap in _ctorParams)
{
var includedParam = includedParams[index];
if (!includedParam.CanResolveValue || _ctorParams[index].CanResolveValue)
var inheritedParameterMap = constructorMap[parameterMap.DestinationName];
if(inheritedParameterMap is not { IsMapped: true, DestinationType: var type } || type != parameterMap.DestinationType || !parameterMap.ApplyMap(inheritedParameterMap, includedMember))
{
continue;
}
canResolve = true;
applied = true;
_canResolve = null;
_ctorParams[index] = new(includedParam, includedMember);
}
return canResolve;
return applied;
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
Expand All @@ -82,16 +79,26 @@ public ConstructorParameterMap(TypeMap typeMap, ParameterInfo parameter, MemberI
SourceMembers = Array.Empty<MemberInfo>();
}
}
public ConstructorParameterMap(ConstructorParameterMap parameterMap, IncludedMember includedMember) :
this(includedMember.TypeMap, parameterMap.Parameter, parameterMap.SourceMembers) =>
IncludedMember = includedMember.Chain(parameterMap.IncludedMember);
public ParameterInfo Parameter { get; }
public override Type DestinationType => Parameter.ParameterType;
public override IncludedMember IncludedMember { get; }
public override IncludedMember IncludedMember { get; protected set; }
public override MemberInfo[] SourceMembers { get; set; }
public override string DestinationName => Parameter.Name;
public Expression DefaultValue(IGlobalConfiguration configuration) => Parameter.IsOptional ? Parameter.GetDefaultValue(configuration) : configuration.Default(DestinationType);
public override string ToString() => $"{Constructor}, parameter {DestinationName}";
private MemberInfo Constructor => Parameter.Member;
public override string ToString() => $"{Parameter.Member}, parameter {DestinationName}";
public bool ApplyMap(ConstructorParameterMap inheritedParameterMap, IncludedMember includedMember)
{
if(includedMember != null && IsMapped)
{
return false;
}
ExplicitExpansion ??= inheritedParameterMap.ExplicitExpansion;
if(ApplyInheritedMap(inheritedParameterMap))
{
IncludedMember = includedMember?.Chain(inheritedParameterMap.IncludedMember);
return true;
}
return false;
}
public override bool? ExplicitExpansion { get; set; }
}
4 changes: 2 additions & 2 deletions src/AutoMapper/Execution/ExpressionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -362,10 +362,10 @@ private static Expression Replace(this ParameterReplaceVisitor visitor, LambdaEx
return newLambda;
}
public static Expression Replace(this Expression exp, Expression old, Expression replace) => new ReplaceVisitor().Replace(exp, old, replace);
public static Expression NullCheck(this Expression expression, IGlobalConfiguration configuration, MemberMap memberMap = null, Expression defaultValue = null)
public static Expression NullCheck(this Expression expression, IGlobalConfiguration configuration, MemberMap memberMap = null, Expression defaultValue = null, IncludedMember includedMember = null)
{
var chain = expression.GetChain();
var min = memberMap?.IncludedMember == null ? 2 : 1;
var min = (includedMember ?? memberMap?.IncludedMember) == null ? 2 : 1;
if (chain.Count < min || chain.Peek().Target is not ParameterExpression parameter)
{
return expression;
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Execution/TypeMapPlanBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ private static void CheckForCycles(IGlobalConfiguration configuration, TypeMap t
}
if (typeMapsPath.Contains(memberTypeMap))
{
if (memberTypeMap.SourceType.IsValueType)
if (memberTypeMap.SourceType.IsValueType || memberTypeMap.DestinationType.IsValueType)
{
if (memberTypeMap.MaxDepth == 0)
{
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/Mapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public interface IMapperBase
/// <summary>
/// Execute a mapping from the source object to a new destination object.
/// </summary>
/// <typeparam name="TSource">Source type to use, regardless of the runtime type</typeparam>
/// <typeparam name="TSource">Source type to use</typeparam>
/// <typeparam name="TDestination">Destination type to create</typeparam>
/// <param name="source">Source object to map from</param>
/// <returns>Mapped destination object</returns>
Expand Down
31 changes: 27 additions & 4 deletions src/AutoMapper/MemberMap.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System.Security.AccessControl;

namespace AutoMapper;
/// <summary>
/// The base class for member maps (property, constructor and path maps).
Expand All @@ -22,12 +20,12 @@ public void SetResolver(IValueResolver resolver)
}
public virtual Type SourceType => _sourceType ??= GetSourceType();
public virtual MemberInfo[] SourceMembers { get => Array.Empty<MemberInfo>(); set { } }
public virtual IncludedMember IncludedMember => null;
public virtual IncludedMember IncludedMember { get => default; protected set { } }
public virtual string DestinationName => default;
public virtual Type DestinationType { get => default; protected set { } }
public virtual TypePair Types() => new(SourceType, DestinationType);
public bool CanResolveValue => !Ignored && Resolver != null;
public bool IsMapped => Ignored || CanResolveValue;
public bool IsMapped => Ignored || Resolver != null;
public virtual bool Ignored { get => default; set { } }
public virtual bool? ExplicitExpansion { get => default; set { } }
public virtual bool Inline { get; set; } = true;
Expand Down Expand Up @@ -65,6 +63,31 @@ public void MapByConvention(MemberInfo[] sourceMembers)
SourceMembers = sourceMembers;
Resolver = this;
}
protected bool ApplyInheritedMap(MemberMap inheritedMap)
{
if(Ignored || IsResolveConfigured)
{
return false;
}
if(inheritedMap.Ignored)
{
Ignored = true;
return true;
}
if(inheritedMap.IsResolveConfigured)
{
_sourceType = inheritedMap._sourceType;
Resolver = inheritedMap.Resolver.CloseGenerics(TypeMap);
return true;
}
if(Resolver == null)
{
_sourceType = inheritedMap._sourceType;
MapByConvention(inheritedMap.SourceMembers);
return true;
}
return false;
}
Expression IValueResolver.GetExpression(IGlobalConfiguration configuration, MemberMap memberMap, Expression source, Expression destination, Expression destinationMember) =>
ChainSourceMembers(configuration, source, destinationMember);
MemberInfo IValueResolver.GetSourceMember(MemberMap memberMap) => SourceMembers[0];
Expand Down
2 changes: 1 addition & 1 deletion src/AutoMapper/PathMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ public PathMap(LambdaExpression destinationExpression, MemberPath memberPath, Ty
public override string DestinationName => MemberPath.ToString();
public override bool CanBeSet => ReflectionHelper.CanBeSet(MemberPath.Last);
public override bool Ignored { get; set; }
public override IncludedMember IncludedMember { get; }
public override IncludedMember IncludedMember { get; protected set; }
public override LambdaExpression Condition { get; set; }
}
Loading