From 0c27b16f5cb8061daa3485a2fe1108a84269a3e6 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 17 Jun 2016 07:42:19 +0900 Subject: [PATCH] HACK: add casting hack for explicit interface implementation calls --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index f74c90467..7b6035ff1 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -647,7 +647,12 @@ namespace ICSharpCode.Decompiler.CSharp expr = new IndexerExpression(target.Expression, argumentExpressions); } } else { - var mre = new MemberReferenceExpression(target.Expression, inst.Method.Name); + Expression targetExpr = target.Expression; + // HACK : convert this.Dispose() to ((IDisposable)this).Dispose(), if Dispose is an explicitly implemented interface method. + if (inst.Method.IsExplicitInterfaceImplementation && targetExpr is ThisReferenceExpression) { + targetExpr = targetExpr.CastTo(ConvertType(inst.Method.ImplementedInterfaceMembers[0].DeclaringType)); + } + var mre = new MemberReferenceExpression(targetExpr, inst.Method.Name); mre.TypeArguments.AddRange(inst.Method.TypeArguments.Select(a => ConvertType(a))); expr = new InvocationExpression(mre, argumentExpressions); }