编程语言
首页 > 编程语言> > c# – 使用Reflection.Emit将自定义属性复制到另一个方法

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