public override bool Equals(object obj)
{
if (obj == this) return true;
if (obj == null || obj.GetType() != this.GetType()) return false;
MyCompositeKey test = (MyCompositeKey)obj;
return (_keyA == test.KeyA || (_keyA != null && _keyA.Equals(test.KeyA))) &&
(_keyB == test.KeyB || (_keyB != null && _keyB.Equals(test.KeyB)));
}
private CodeTypeMember GetCompositeClassEqualsMethod(string className, List<CodeMemberField> fields)
CodeMemberMethod equals = new CodeMemberMethod();
equals.Attributes = MemberAttributes.Public | MemberAttributes.Override;
equals.ReturnType = new CodeTypeReference(typeof(Boolean));
equals.Name = "Equals";
CodeParameterDeclarationExpression param = new CodeParameterDeclarationExpression(typeof(Object), "obj");
equals.Parameters.Add(param);
equals.Statements.Add(new CodeConditionStatement(
new CodeBinaryOperatorExpression(
new CodeFieldReferenceExpression(null, "obj"),
CodeBinaryOperatorType.ValueEquality, new CodeThisReferenceExpression()
), new CodeMethodReturnStatement(new CodePrimitiveExpression(true))
)
);
equals.Statements.Add(new CodeConditionStatement
(
new CodeBinaryOperatorExpression
CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(null)),
CodeBinaryOperatorType.BooleanOr,
new CodeMethodInvokeExpression(new CodeFieldReferenceExpression(null, "obj"), "GetType"),
CodeBinaryOperatorType.IdentityInequality,
new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "GetType"))
, new CodeMethodReturnStatement(new CodePrimitiveExpression(false))
equals.Statements.Add(
new CodeVariableDeclarationStatement(new CodeTypeReference(className), "test",
new CodeCastExpression(new CodeTypeReference(className),
new CodeFieldReferenceExpression(null, "obj"))));
List<CodeExpression> expressions = new List<CodeExpression>();
foreach (CodeMemberField field in fields)
expressions.Add(
//_keyA == test.KeyA
new CodeFieldReferenceExpression(null, field.Name),
CodeBinaryOperatorType.ValueEquality,
new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(null, "test"), field.Name)),
CodeBinaryOperatorType.BooleanOr, // ||
//_keyA != null
new CodePrimitiveExpression(null)
),
CodeBinaryOperatorType.BooleanAnd, // &&
// _keyA.Equals( test.KeyA )
new CodeMethodInvokeExpression(
new CodeFieldReferenceExpression(null, field.Name), "Equals",
new CodeFieldReferenceExpression(
new CodeFieldReferenceExpression(null, "test"), field.Name))
CodeExpression expression = null;
if (expressions.Count > 2)
expression =
new CodeBinaryOperatorExpression(expressions[0], CodeBinaryOperatorType.BooleanAnd, GetBooleanAnd(expressions, 1));
else
expression = new CodeBinaryOperatorExpression(expressions[0], CodeBinaryOperatorType.BooleanAnd, expressions[1]);
equals.Statements.Add(new CodeMethodReturnStatement(expression));
return equals;
Remember Me
Page rendered at 11/22/2008 9:20:14 AM UTC
Ads Via The Lounge
Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.