Search code examples
c#reflection.emit

Reflection Emit to override ToString() in C#


Could someone help me to override ToString() method?

The C# code I want to build is as follows:

  public override string ToString()
  {
        return $"{Id}, {Description}, {ParentId}";
  }

The code I made to emit is as follows:

MethodBuilder toStringMethod = typebuilder.DefineMethod("ToString", 
MethodAttributes.Public | MethodAttributes.HideBySig | 
MethodAttributes.NewSlot | MethodAttributes.Virtual | 
MethodAttributes.Final,    CallingConventions.HasThis, typeof(string), 
Type.EmptyTypes);

ILGenerator il = toStringMethod.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldstr, "{0},{1},{2}");
il.Emit(OpCodes.Ldc_I4_4);
il.Emit(OpCodes.Call, getIdMethodeBuilder);
il.Emit(OpCodes.Call, getDescriptionMethodeBuilder);
il.Emit(OpCodes.Call, getParentIdMethodeBuilder);

il.Emit(OpCodes.Ret);
typebuilder.DefineMethodOverride(toStringMethod, typeof(object).GetMethod("ToString"));

Thanks in advance.


Solution

  • Thanks to @lasse. I got my code corrected as follows:

      Type[] formatStringArgs = { typeof(string), typeof(int), typeof(string), typeof(int) };
       MethodInfo formatString = typeof(String).GetMethod("Format", formatStringArgs);
    
       il = toStringMethod.GetILGenerator();
       il.Emit(OpCodes.Nop);
       il.Emit(OpCodes.Ldstr, "{0},{1},{2}");
    
       il.Emit(OpCodes.Ldarg_0);
       il.Emit(OpCodes.Call, getIdMethodeBuilder);
       il.Emit(OpCodes.Box, typeof(Int32));
    
       il.Emit(OpCodes.Ldarg_0);                   
       il.Emit(OpCodes.Call, getDescriptionMethodeBuilder);
    
       il.Emit(OpCodes.Ldarg_0);
       il.Emit(OpCodes.Call, getParentIdMethodeBuilder);
       il.Emit(OpCodes.Box, typeof(Int32));
    
       il.Emit(OpCodes.Call, formatString);
       il.Emit(OpCodes.Ret);
       typebuilder.DefineMethodOverride(toStringMethod, 
       typeof(object).GetMethod("ToString"));
    

    Thanks all.