#c# #.net #reflection.emit
#c# #.net #reflection.emit
Вопрос:
Я определяю некоторые типы через System.Reflection.Emit. Представьте, что я хочу иметь сигнатуру метода с некоторыми пользовательскими атрибутами, что-то вроде этого:
[return: MyAttr]
MyType MethodName([MyOtherAttr] MyOtherType);
Я использую такой код для его генерации:
TypeBuilder t = assembly.DefineType(...);
MethodAttributes methodAttr = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot;
MethodBuilder method = t.DefineMethod("MethodName", methodAttr, typeof(MyType), new Type[] { typeof(MyOtherType) });
method.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);
// return type
ParameterBuilder pbr = method.DefineParameter(0, ParameterAttributes.Retval, null);
CustomAttributeBuilder cabr = GetMyAttrBuilder();
pbr.SetCustomAttribute(cabr);
// parameter
ParameterBuilder pbp = method.DefineParameter(1, ParameterAttributes.None, null);
CustomAttributeBuilder cabp = GetMyOtherAttrBuilder();
pbp.SetCustomAttribute(cabp);
t.CreateType();
Но сгенерированная сигнатура метода является:
MyType MethodName([MyOtherAttr] MyOtherType);
Атрибут return отсутствует: (Есть идеи, как добиться правильного поведения?
Заранее спасибо
Ответ №1:
Этот код, о котором идет речь, работает хорошо, просто дизассемблер C # не показывает его, il one показывает.