【问题标题】:Generating nullable type properties using CodeDom使用 CodeDom 生成可为空的类型属性
【发布时间】:2014-08-10 22:45:43
【问题描述】:

我正在使用 CodeDom 生成一些 C# 代码,基本上是尝试复制现有类的所有属性。代码相当简单:

//type is a Type
foreach(PropertyInfo p in type.GetProperties())
 {
    Type eType = p.PropertyType;
    AddProperty(eType, p.Name);
    // ...
 }

void AddProperty(Type propType, string name)
{
    CodeMemberProperty newProperty = new CodeMemberProperty();
    newProperty.Type = new CodeTypeReference(propType);         
    newProperty.Name = name;
    targetClass.Members.Add(newProperty);
}

这对字符串很有效,但对于可以为空的原始类型,例如 decimal?int?,在生成的代码中我会得到以下内容:

public virtual System.Nullable<decimal> MyNullableDecimal

而不是

public decimal? MyNullableDecimal

我想不通。有什么建议吗?

【问题讨论】:

    标签: c# properties nullable codedom


    【解决方案1】:

    您会看到virtual 属性,因为这是默认添加的。为了删除它,您必须明确将其标记为“final”:

    newProperty.Attributes = MemberAttributes.Final;
    

    如果您想知道T? 表示法:这只是语法糖,等于Nullable&lt;T&gt;。我不相信您可以使用 ? 创建它,因为您基本上是在使用 CodeDom 在较低级别上工作。

    【讨论】:

    • 是的,我想知道 T?符号。很抱歉造成混乱。我已经猜到这是同一件事,但我真的很想得到 T 吗?代码中的符号,因为它更整洁。您能否详细说明一下为此目的使用 CodeExpression 吗?
    • @Shaggydog:我又看了一遍,我认为解决方法不会奏效,因为无法为属性的类型提供表达式。据我所知,您必须对System.Nullable&lt;T&gt; 表示法没问题。 CodeDom 的运行水平低于您通常使用的水平:您必须使用显式构建块构建代码。 ? 表示法是 C# 语法提供的用于获取其中一个构建块的快捷方式的众多功能之一,但显然将其与实际构建块交织在一起并没有多大意义。
    • 我明白了。嗯,我想这样可以接受。如果没有,我总是可以对生成的源文件运行一些正则表达式。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多