There are several problems in the code.
In the parent setter method, you missed the parameter declaration:
MethodBuilder setParentMethod = typeBuilder.DefineMethod($"set_{propertyBuilder.Name}", getSetAttr, null, new [] { propertyBuilder.PropertyType });
Here you declare a redundant support field, just delete this line:
parentField = typeBuilder.DefineField($"_{depthProperty}", typeBuilder, FieldAttributes.Private);
Your deepth property is of the wrong type, it must be of type int:
propertyBuilder = typeBuilder.DefineProperty(depthProperty, PropertyAttributes.None, typeof(int), Type.EmptyTypes); MethodBuilder getDepthMethod = typeBuilder.DefineMethod($"get_{depthProperty}", getSetAttr, propertyBuilder.PropertyType, Type.EmptyTypes);
The IL code that you generate for your computed property looks like debugging code, I replaced it with the release code. You also emit incomplete branch instructions, you must pass the target label as the second parameter, look at this working method:
il = getDepthMethod.GetILGenerator(); var notNullLabel = il.DefineLabel(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, getParentMethod); il.Emit(OpCodes.Brtrue_S, notNullLabel); il.Emit(OpCodes.Ldc_I4_M1); il.Emit(OpCodes.Ret); il.MarkLabel(notNullLabel); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Call, getParentMethod); il.Emit(OpCodes.Callvirt, getDepthMethod); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Add); il.Emit(OpCodes.Ret);
Last but not least, you must wrap your null argument in an array of objects so that the activator can find the expected constructor overload:
var obj1 = Activator.CreateInstance(type, new object[] { null });