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.
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.