编程语言
首页 > 编程语言> > c#-CodeDom中方法的复杂属性声明

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