Wenn der betreffende Typ implementiert operator ==()
, dann kann ich leicht einen Ausdruck erstellen, um es aufzurufen. Wenn der Operator jedoch in der Basisklasse definiert ist, funktioniert er nicht. Sehen Sie, wie drei Assertions bestehen, aber eine fehlschlägt.Wie erstelle ich einen Ausdruck, um einen Gleichheitsoperator aus einer Basisklasse aufzurufen?
Gibt es einen richtigen Weg, dies zu tun?
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Assert.IsTrue(new A(42) == new A(42)); // PASS
Assert.IsTrue(ExecuteOperatorEqual(new A(42), new A(42))); // PASS
Assert.IsTrue(new B(42) == new B(42)); // PASS
Assert.IsTrue(ExecuteOperatorEqual(new B(42), new B(42))); // FAIL
}
static bool ExecuteOperatorEqual<T>(T item1, T item2)
{
var expression = Expression.Lambda<Func<bool>>(
Expression.Equal(
Expression.Constant(item1),
Expression.Constant(item2)));
return expression.Compile()();
}
}
class A
{
private readonly int _value;
public A(int value)
{
_value = value;
}
public static bool operator ==(A left, A right) => left._value == right._value;
public static bool operator !=(A left, A right) => left._value != right._value;
}
class B : A
{
public B(int value) : base(value)
{
}
}
"es funktioniert nicht" - in welcher Weise scheitert es? – Blorgbeard
Siehe die Kommentare im Code: Die ersten 3 Assertions passieren, aber die vierte nicht. –
Hmm, ich denke [Expression.Equal] (https://msdn.microsoft.com/en-us/library/bb352749.aspx) schaut nicht auf die Oberklasse, wenn sie versucht, die Gleichheits-Methode zu finden. [Diese Überladung] (https://msdn.microsoft.com/en-us/library/bb352235.aspx) ermöglicht es Ihnen, ein MethodInfo zu spezifizieren. – Blorgbeard