c# – 使用Reflection.Emit将自定义属性复制到另一个方法
作者:互联网
我正在尝试基于现有接口生成一组新的wcf接口.
我正在使用Reflection.Emit命名空间来完成此任务.我的问题是如何将旧的自定义属性从一个方法复制到新方法.我见过的每个SetCustomAttributes()示例都需要事先知道属性类型.我需要在运行时发现属性类型.有什么想法吗?
解决方法:
您(frjames)发布的答案很接近,但不考虑属性初始值设定项,如…
[ServiceBehavior(Name="ServiceName")]
但是,将CustomAttributeData转换为CustomAttributeBuilder以在Reflection.Emit中使用的想法是正确的.
我最终不得不为一个开源项目(Autofac)做这个,并想出了这个扩展方法:
public static CustomAttributeBuilder ToAttributeBuilder(this CustomAttributeData data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var constructorArguments = new List<object>();
foreach (var ctorArg in data.ConstructorArguments)
{
constructorArguments.Add(ctorArg.Value);
}
var propertyArguments = new List<PropertyInfo>();
var propertyArgumentValues = new List<object>();
var fieldArguments = new List<FieldInfo>();
var fieldArgumentValues = new List<object>();
foreach (var namedArg in data.NamedArguments)
{
var fi = namedArg.MemberInfo as FieldInfo;
var pi = namedArg.MemberInfo as PropertyInfo;
if (fi != null)
{
fieldArguments.Add(fi);
fieldArgumentValues.Add(namedArg.TypedValue.Value);
}
else if (pi != null)
{
propertyArguments.Add(pi);
propertyArgumentValues.Add(namedArg.TypedValue.Value);
}
}
return new CustomAttributeBuilder(
data.Constructor,
constructorArguments.ToArray(),
propertyArguments.ToArray(),
propertyArgumentValues.ToArray(),
fieldArguments.ToArray(),
fieldArgumentValues.ToArray());
}
那个占了初始化属性的所有方法.
标签:c,interface,wcf,reflection-emit 来源: https://codeday.me/bug/20190610/1213757.html