【问题标题】:C# CodeDOM: Adding Enum members at runtimeC# CodeDOM:在运行时添加枚举成员
【发布时间】:2011-02-22 04:14:59
【问题描述】:

我正在尝试为从 XSD 文件解析的所有枚举添加“NoneOfTheBelow”选项。 我正在扩展来自Xsd2Code tool 的代码。

当我使用下面的代码生成输出时,枚举不包含我添加的新成员。 有人可以帮忙吗?

var ns = new CodeNamespace();

/* ... Initialize ns from XSD ... */

// Create a dummy array for iteration, because a collection cannot be modified when it is being iterated over.
CodeTypeDeclarationCollection types = new CodeTypeDeclarationCollection();
foreach (CodeTypeDeclaration t0 in ns.Types)
{
   types.Add(new CodeTypeDeclaration(t0.Name));
}

// Scan for enum types and add desired markup to the members.
int typeIndex = 0;
foreach (CodeTypeDeclaration t0 in types)
{
   CodeTypeDeclaration t = ns.Types[typeIndex];

   // Add an element for blank entry to the enum.
   CodeTypeMember noneOfTheBelow = new CodeTypeMember();
   noneOfTheBelow.Name = "NoneOfTheBelow";
   noneOfTheBelow.Comments.Add(new CodeCommentStatement( "<summary>None of the below.</summary>"));
   noneOfTheBelow.CustomAttributes.Add(new CodeAttributeDeclaration("XmlEnum", new CodeAttributeArgument(new CodePrimitiveExpression("Test"))));
   noneOfTheBelow.CustomAttributes.Add(new CodeAttributeDeclaration("Description", new CodeAttributeArgument(new CodePrimitiveExpression("Test"))));
   t.Members.Insert(0, noneOfTheBelow);
}

【问题讨论】:

  • 你的第二个循环没有意义。

标签: c# codedom


【解决方案1】:

对于枚举,你需要添加 CodeMemberField 实例,而不是 CodeTypeMember,所以类似:

CodeMemberField noneOfTheBelow = new CodeMemberField();
noneOfTheBelow.Attributes = MemberAttributes.Public | MemberAttributes.Static;
noneOfTheBelow.Name = "NoneOfTheBelow";
t.Members.Insert(0, noneOfTheBelow);

【讨论】:

  • 我很好奇,Public 和 Static 属性对枚举成员有影响吗?如果没有该行设置属性,我似乎得到了相同的输出。
  • @dythim - 嗯...我从自己的源代码中复制了一段代码,但它们可能没用:-) 它还取决于 CodeDom 提供程序(c#、VB.Net 等.)
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多