Класс вызова, созданный во время выполнения из другого объекта, созданного во время выполнения

Я работаю над проектом C#, в котором я динамически создаю сопоставление для решения ORM, а именно nHibernate, во время выполнения. из данной базы данных на данном сервере. Прямо сейчас я сосредоточен на том, чтобы заставить работать базовый объект и генерацию класса реляционного отображения во время выполнения. Я могу скомпилировать в памяти во время выполнения следующий класс через CodeDOM:

namespace DataDictionary.Domain
{
    public class Entity
    {
        public virtual int EntityID { get; set; }
        public virtual string EntityName { get; set; }
        public virtual DateTime EntityFoundationDate { get; set; }
    }
}

Однако, когда я пытаюсь скомпилировать эквивалент следующего класса с помощью CodeDOM:

using System;
using System.Linq;
using NHibernate.Cfg;
using NHibernate.Cfg.MappingSchema;
...
namespace DataDictionary.Domain
{
    public class EntityMap : ClassMapping<Entity>
    {
        public EntityMap()
        {
            this.Table(Entity);
            this.ID(p => p.EntityID);
            this.Property(p => p.EntityName);
            this.Property(p => p.EntityFoundationDate);
        }
    }
}

При компиляции получаю следующую ошибку: error CS0246: The type or namespace name 'Entity' could not be found (are you missing a using directive or an assembly reference?)

Мой вопрос: почему Entity, несмотря на то, что он был помещен в правильное пространство имен во время компиляции во время выполнения, не виден EntityMap.

Кроме того, для справки, вот метод, который я использую для создания EntityMap:

    public static object CreateNewObject(ref object table, AssemblyName domain, params FieldInfo[] columns)
    {
        if (columns == null || columns.Length == 0)
            return null;

        string tableName = table.GetType().Name;

        //check to see if a class exists which both matches the name of `table`
        //and whose full name contains the correct assembly to be used.
        var namespaceCheck = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                              from type in assembly.GetTypes()
                              where type.Name == tableName && Utilities.GetFriendlyAssemblyName(type.FullName).Equals("DataDictionary.Domain")
                              select type).FirstOrDefault();

        if (namespaceCheck == null) 
            throw new InvalidOperationException("Valid type not found.");

        StringBuilder builder = new StringBuilder("using NHibernate; using NHibernate.Cfg; using NHibernate.Cfg.MappingSchema; using NHibernate.Dialect; using NHibernate.Mapping.ByCode; using NHibernate.Mapping.ByCode.Conformist; ");

        builder.Append("namespace DataDictionary.Domain{");

        builder.AppendFormat("public class {0}Map : ClassMapping<{0}> {{", tableName);
        builder.AppendFormat("public {0}Map(){{\n",tableName);
        builder.AppendFormat("this.Table({0});", tableName);

        //find the ID column.
        var list = columns.Where(x => x.Name.ToUpper().Contains("ID"));
        builder.AppendFormat("this.ID(p => p.{0})", Utilities.cleanFieldName(list.ElementAt(0).Name));
        columns = columns.Where(x => !x.Equals(list.ElementAt(0))).ToArray();

        //map the properties.
        foreach (FieldInfo column in columns)
        {
            builder.AppendFormat("this.Property(p => p.{0});", Utilities.cleanFieldName(column.Name));
        }

        //close all open brackets.
        builder.Append("}}}");

        //send code to helper class for runtime compilation via CodeDOM.
        return CodeDOM_Helpers.Execute(builder.ToString(), tableName,domain.Name);
    }

person Expack3    schedule 17.12.2015    source источник


Ответы (1)


Я думаю, вы имеете в виду, возможно, это:

   public EntityMap()
    {
        this.Table(Entity);
        this.ID(p => p.Entity);
        this.Property(p => p.EntityName);
        this.Property(p => p.EntityFoundationDate);
    }

читать как:

   public EntityMap()
    {
        this.Table(Entity);
        this.ID(p => p.EntityID);  // since the type of p does not have an "Entity" property
        this.Property(p => p.EntityName);
        this.Property(p => p.EntityFoundationDate);
    }
person MaLio    schedule 18.12.2015
comment
Кроме того, хотел бы добавить, что это не решило мою проблему, поскольку я все еще получаю ту же ошибку. (Что имеет смысл, поскольку это была опечатка в классе сопоставления, которая сработала бы, когда класс сопоставления фактически увидел класс объекта.) - person Expack3; 19.12.2015