frj*_*mes 4 c# wcf interface reflection.emit
我正在尝试基于现有接口生成一组新的wcf接口.我正在使用Reflection.Emit命名空间来完成此任务.我的问题是如何将旧的自定义属性从一个方法复制到新方法.我见过的每个SetCustomAttributes()示例都需要事先知道属性类型.我需要在运行时发现属性类型.有什么想法吗?
您(frjames)发布的答案很接近,但不考虑属性初始值设定项,如...
[ServiceBehavior(Name="ServiceName")]
Run Code Online (Sandbox Code Playgroud)
但是,将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());
}
Run Code Online (Sandbox Code Playgroud)
那个占了初始化属性的所有方法.
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |