c#-CodeDom中方法的复杂属性声明
作者:互联网
我正在尝试使用CodeDom生成一些方法,但在为这些方法生成自定义属性时遇到问题.
我可以管理简单的空属性,例如
[DataMember()]
或带有字符串值参数的属性,
[DataContract(Namespace =“ http:// somenamespace”)]
但是我需要生成更复杂的属性,例如
[WebInvoke(方法=“ POST”,UriTemplate =“ SomeTemplate”,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]
和
[FaultContract(typeof(Collection< MyFault>)))]
对于具有枚举值ResponseFormat = WebMessageFormat.Json的参数,我尝试了类似于对字符串所做的方法,创建了CodePrimitiveExpression实例:
CodeAttributeDeclaration webInvoke = new CodeAttributeDeclaration()
{
Name = "WebInvoke",
Arguments =
{
new CodeAttributeArgument
{
Name = "Method",
Value = new CodePrimitiveExpression("POST")
},
new CodeAttributeArgument
{
Name = "UriTemplate",
Value = new CodePrimitiveExpression(method.Name)
},
new CodeAttributeArgument
{
Name = "RequestFormat",
Value = new CodePrimitiveExpression(WebMessageFormat.Json)
},
new CodeAttributeArgument
{
Name = "ResponseFormat",
Value = new CodePrimitiveExpression(WebMessageFormat.Json)
}
}
};
但是,这行不通,我得到一个例外
Invalid Primitive Type: System.ServiceModel.Web.WebMessageFormat. Consider using CodeObjectCreateExpression.
我确实考虑过使用CodeObjectCreateExpression,但我不知道如何.它期望一个字符串或一个CodeTypeReference,以及作为第二个参数的CodeExpression参数数组.我不知道要放什么参数.
至于其他属性,即typeof(Colleciton< MyFault>),我什至不知道从哪里开始.任何帮助,将不胜感激.
编辑:有人建议我在我要模仿的方法上调用CustomAttributeData.GetCustomAttributes,所以我做到了.为了提高效率和清晰度,我将在屏幕截图中提供数据.这使我对正在处理的内容有了更好的了解,但是我仍然不确定如何实现它.
解决方法:
WebMessageFormat.Json之类的表达式看起来就像访问静态字段,因此您必须编写它:
new CodeAttributeArgument
{
Name = "RequestFormat",
Value = new CodeFieldReferenceExpression(
new CodeTypeReferenceExpression("WebMessageFormat"), "Json")
}
typeof表达式是一种特殊的表达式类型,因此具有自己的CodeDOM类型:
new CodeAttributeDeclaration(
"FaultContract",
new CodeAttributeArgument(new CodeTypeOfExpression("Collection<MyFault>")))
要查看CodeDOM中可用的所有表达式类型的列表,请查看the inheritance hierarchy in the docs of CodeExpression
.
标签:custom-attributes,codedom,c 来源: https://codeday.me/bug/20191121/2051487.html