Skip to content

Commit 91f4c13

Browse files
committed
CSHARP-1468: Fix conversion issue to base class.
1 parent 142cd7e commit 91f4c13

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/MongoDB.Driver.Tests/FilterDefinitionBuilderTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,19 @@ public void Type_Typed()
824824
Assert(subject.Type("FirstName", BsonType.String), "{fn: {$type: 2}}");
825825
}
826826

827+
[Test]
828+
public void Generic_type_constraint_causing_base_class_conversion()
829+
{
830+
var filter = TypeConstrainedFilter<Twin>(21);
831+
832+
Assert(filter, "{ age: 21 }");
833+
}
834+
835+
private FilterDefinition<T> TypeConstrainedFilter<T>(int age) where T : Person
836+
{
837+
return CreateSubject<T>().Eq(x => x.Age, age);
838+
}
839+
827840
private void Assert<TDocument>(FilterDefinition<TDocument> filter, string expected)
828841
{
829842
Assert(filter, BsonDocument.Parse(expected));

src/MongoDB.Driver/Linq/Processors/SerializationBinder.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,20 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
161161
return base.VisitMethodCall(node);
162162
}
163163

164+
protected override Expression VisitUnary(UnaryExpression node)
165+
{
166+
var newNode = (UnaryExpression)base.VisitUnary(node);
167+
if (newNode.NodeType == ExpressionType.Convert || newNode.NodeType == ExpressionType.ConvertChecked)
168+
{
169+
if (newNode.Method == null && !newNode.IsLiftedToNull && newNode.Type.IsAssignableFrom(newNode.Operand.Type))
170+
{
171+
return newNode.Operand;
172+
}
173+
}
174+
175+
return newNode;
176+
}
177+
164178
// private methods
165179
private Expression BindElementAt(MethodCallExpression node)
166180
{

0 commit comments

Comments
 (0)