C# 使用反射或IL向ReturnParameter添加自定义属性

C# 使用反射或IL向ReturnParameter添加自定义属性,c#,reflection,reflection.emit,C#,Reflection,Reflection.emit,我正在尝试使用IL在运行时创建一些类型。我有一个原始的MethodInfo,我必须复制它 var parameters=OriginalMethod.GetParameters(); MethodBuilder MethodBuilder=Builder.DefineMethod( $“k__BackingMethod”, 原始方法属性, 打电话给我,有这个, 原始方法返回类型, parameters.Select(i=>i.ParameterType).ToArray() ); foreach

我正在尝试使用IL在运行时创建一些类型。我有一个原始的
MethodInfo
,我必须复制它

var parameters=OriginalMethod.GetParameters();
MethodBuilder MethodBuilder=Builder.DefineMethod(
$“k__BackingMethod”,
原始方法属性,
打电话给我,有这个,
原始方法返回类型,
parameters.Select(i=>i.ParameterType).ToArray()
);
foreach(OriginalMethod.GetCustomAttributesData()中的var属性。ToCustomAttributeBuilder())
methodBuilder.SetCustomAttribute(属性);
foreach(OriginalMethod.ReturnParameter.GetCustomAttributesData()中的var属性。ToCustomAttributeBuilder())
methodBuilder.SetCustomAttribute(属性);//选择(attribute=>attribute.ToCustomAttributeBuilder()).ToArray();
内部静态CustomAttributeBuilder到CustomAttribute Builder(此CustomAttributeData CustomAttribute)
{
var attributeArgs=CustomAttribute.ConstructorArguments.Select(a=>a.Value.ToArray();
var propertyArgs=CustomAttribute.NamedArguments.Where(i=>i.MemberInfo是PropertyInfo);
var propertyInfos=propertyArgs.Select(a=>(PropertyInfo)a.MemberInfo.ToArray();
var propertyValues=propertyArgs.Select(a=>a.TypedValue.Value).ToArray();
var fieldArgs=CustomAttribute.NamedArguments.Where(i=>i.MemberInfo是FieldInfo);
var namedFieldInfos=fieldArgs.Select(a=>(FieldInfo)a.MemberInfo.ToArray();
var namedFieldValues=fieldArgs.Select(a=>a.TypedValue.Value).ToArray();
返回新的CustomAttributeBuilder(CustomAttribute.Constructor、attributeArgs、PropertyInfo、propertyValues、namedFieldInfos、namedFieldValues);
}

您需要将自定义属性应用于返回值参数,而不是方法:

ParameterBuilder returnValueParameterBuilder = 
    methodBuilder.DefineParameter(0, ParameterAttributes.Retval, parameterName: null);

foreach (var attribute in OriginalMethod.ReturnParameter.GetCustomAttributesData()
                                                        .ToCustomAttributeBuilder())
{
    returnValueParameterBuilder.SetCustomAttribute(attribute);
}

能否将
的代码添加到CustomAttribute Builder
?@vc74添加了该代码。您还需要什么吗?不应该
methodBuilder.SetCustomAttribute(attribute)
returnValueParameterBuilder.SetCustomAttribute(attribute)
?但是我没有
returnValueParameterBuilder
,也找不到如何构建它。有什么指针吗?在我看来,你好像是在对参数应用方法属性。请尝试
ParameterBuilder returnValueParameterBuilder=methodBuilder.DefineParameter(0,ParameterAttributes.Retval,parameterName:null)保存了我。再次感谢!