【问题标题】:How to correctly setup custom constructors using Codedom如何使用 Codedom 正确设置自定义构造函数
【发布时间】:2015-06-29 22:51:56
【问题描述】:

我正在尝试让 Codedom 生成以下代码:

public class NewContext : DbContext
{

    public NewContext()
        : base("NewContext")
    {
        EntityToRegisterDictionary = new ConcurrentDictionary<string, Assembly>();
    }

    static NewContext()
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EFEntityModelContext>());
    }
}

我可以生成

public class NewContext : DbContext

没有任何问题。我在编写创建两个构造函数的代码时遇到了问题。我创建了两个方法,每个构造函数一个方法。这就是我的方法的样子:

public static CodeConstructor BaseStringConstructor(string connectionStr)
{
    CodeConstructor baseStringConstructor = new CodeConstructor();
    baseStringConstructor.Attributes = MemberAttributes.Public;
    baseStringConstructor.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("\"connectionStr\""));
    CodeAssignStatement body = new CodeAssignStatement();
    body.Left = new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(), "EntityToRegisterDictionary");
    body.Right = new CodeObjectCreateExpression("ConcurrentDictionary<string, Assembly>");
    baseStringConstructor.Statements.Add(body);
    return baseStringConstructor;
}

public static CodeConstructor StaticInitializerConstructor()
{
    CodeConstructor constructor = new CodeConstructor();
    constructor.Attributes = MemberAttributes.Static;
    CodeObjectCreateExpression body = new CodeObjectCreateExpression("Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EFEntityModelContext>");            
    constructor.Statements.Add(body);
    return constructor;
}

然而,这段代码并不能产生我想要的上面的代码。我明白了:

public NewContext() : 
        base("connectionStr")
{
    .EntityToRegisterDictionary = new ConcurrentDictionary<string, Assembly>();
}

NewContext()
{
    new Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EFEntityModelContext>();
}

“public NewContext()”构造函数中的问题是有一个'.'之前

EntityToRegisterDictionary

我认为这是因为这条线

body.Left = new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(), "EntityToRegisterDictionary");

有没有人知道怎么做没有句号?

“静态NewContext()”构造函数存在三个问题:

  1. Codedom 在 NewContext() 之前不写静态

  2. 它在数据库之前写入新的。

  3. 我不能在末尾的 () 之后添加右括号,因为 () 会在我写的任何内容之后自动添加。

有人知道怎么写吗

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EFEntityModelContext>());

没有 new 关键字和添加右括号?

编辑:顺便说一下,EntityToRegisterDictionary 是我在下面定义的:

public IDictionary<string, Assembly> EntityToRegisterDictionary { get; private set; }

我只是没有包含所有这些上下文类。

【问题讨论】:

    标签: c# constructor codedom


    【解决方案1】:

    “public NewContext()”构造函数中的问题是有一个'.'之前

    是的,您提供的CodeFieldReferenceExpression 没有实际的字段引用,因此它只是使用一个空字符串。您正在寻找的是CodeThisReferenceExpression,因为您只是在访问同一个班级的成员。

    body.Left = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "EntityToRegisterDictionary");
    

    这将使用this 关键字生成分配,如下所示:

    this.EntityToRegisterDictionary = new ConcurrentDictionary<string, Assembly>();
    

    Codedom 在 NewContext() 之前不会写静态

    您正在使用 CodeConstructor 创建一个 instance 构造函数。您可以提供的属性之一是MemberAttributes.Static 这一事实有点误导,但当您阅读documentation 的备注部分时就会清楚。您应该使用CodeTypeConstructor 来生成static 构造函数。


    它在数据库之前写入新的。 我不能在末尾的 () 之后添加右括号,因为 () 会在我写的任何内容之后自动添加。

    您正在使用CodeObjectCreateExpression,它用于创建一个类型的新实例,并尝试调用static 方法。要调用方法,您可以使用CodeMethodInvokeExpression。您应该首先为Database.SetInitializer 方法创建一个表达式并使用CodeObjectCreateExpression 传递参数。

    var method = new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("Database"), "SetInitializer");
    var body = new CodeMethodInvokeExpression(method, new CodeObjectCreateExpression("DropCreateDatabaseIfModelChanges<EFEntityModelContext>"));
    constructor.Statements.Add(body);
    

    【讨论】:

      【解决方案2】:
      CodeAssignStatement body = new CodeAssignStatement();
      body.Left = new CodeFieldReferenceExpression(null, "Propiedad ");
      body.Right = new CodeFieldReferenceExpression(null, "parametro");
      
      ------------------------------- OUTPUT--------------------------------
      private Metodo(string parametro) {
          Propiedad = parametro;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2018-07-30
        • 2010-11-30
        • 1970-01-01
        • 2016-10-06
        相关资源
        最近更新 更多