C# 使用反射或IL向ReturnParameter添加自定义属性
我正在尝试使用IL在运行时创建一些类型。我有一个原始的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
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)定义索引为0的参数的代码>保存了我。再次感谢!