如题:
因为对Emit不是特别了解。
所以请教一下大家。
以前一直用反射。但是速度有些慢。例如两个方法。该如何去定义。/// <summary>
        /// 
        /// </summary>
        /// <typeparam name="TInputModel"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="model"></param>
        /// <returns></returns>
        protected virtual TResult ModelToEntity<TInputModel, TResult>(TInputModel model)
            where TInputModel : class
            where TResult : BaseEntity, new()
        {
            TResult result = default(TResult); 
            return result;
        }        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="TInputEntity"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        protected virtual TResult EntityToModel<TInputEntity, TResult>(TInputEntity entity)
            where TInputEntity : BaseEntity
            where TResult : class,new()
        {
            TResult result = default(TResult);
            return result;
        }
        #endregion

解决方案 »

  1.   

    问题补充:
    如何利用 Emit 给 一个属性赋值。而不是生成一个动态类。
    给现有的对象进行赋值。 来代替  PropertyInfo[] 和 GetValue 和 SetValue
      

  2.   

    不需要emit现在,可以用Expression
    http://bbs.csdn.net/topics/390373150
      

  3.   

    Expression 不是 比 Emit慢一些吗 
      

  4.   

    看了你那个帖子。貌似解决不了我的问题。 其实我要解决的就是 。2个 实体类用  一个 Attribute 自动赋值。我以前 一种是 这么写的。T t = new T();
                foreach (var kvp in properties)
                {
                    if (!kvp.Key.CanWrite)
                        continue;
                    MappingDataFieldAttribute mappingDataField = (kvp.Value as MappingDataFieldAttribute);
                    string name = string.IsNullOrEmpty(mappingDataField.MappingDataFieldName) ? kvp.Key.Name : mappingDataField.MappingDataFieldName;
                    object value;
                    try
                    {
                        value = dataReader[name];
                    }
                    catch
                    {
                        continue;
                    }
                    if (value == null || value is DBNull)
                        continue;
                    else
                        try
                        {
                            kvp.Key.SetValue(t, value, null);
                        }
                        catch (ArgumentException aex)
                        {
                            new DBConvertorException(aex.Message, aex);
                        }
                }
                return t;
      

  5.   

    显示只是想把 DataReader 换成 另一个实体。 我不想用 存反射了。如果还用反射是很简单.
      

  6.   

    如果只是要把sql查询到的数据变成entity,用ef就很简单,不需要转换:
    var db = new YourEntities();
    YourClass[] entities = db.Database.SqlQuery<YourClass>("select * from tableXX").ToArray();如果要直接从DbDataReader转成entity,也可以利用ef的Translate,看下面这个例子: using (var db = new DbContext("your connection string"))
    {
    var conn = db.Database.Connection;
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "your sql";
    using (var reader = cmd.ExecuteReader())
    {
    var result = ((IObjectContextAdapter)db).ObjectContext.Translate<YourClass>(reader).ToArray();
    foreach (var entity in result)
    {
    Console.WriteLine(entity);

    }
    }
    }
      

  7.   

    你那个根本满足不了。 我这里有自己定义的特殊的东西。不是每个属性都要转换。何况 Entity Framework 并不适合。
      

  8.   

    不需要的属性加上[NotMapped]标签,也没有让你用ef框架,只是用一下DbContext类。
      

  9.   

    https://github.com/jbogard/AutoMapper找到里面的DataReaderMapper.cs,里面的代码写的很好
      

  10.   

    可以使用DynamicMethod 吧??
    get方法 :DynamicMethod myDynamic=new Dynamicmethod("方法名称",typeof(返回值),new Type[]{typeof(属性类型)} );
    myDynamic.Emit();