如题:
因为对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
因为对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
如何利用 Emit 给 一个属性赋值。而不是生成一个动态类。
给现有的对象进行赋值。 来代替 PropertyInfo[] 和 GetValue 和 SetValue
http://bbs.csdn.net/topics/390373150
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;
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);
}
}
}
get方法 :DynamicMethod myDynamic=new Dynamicmethod("方法名称",typeof(返回值),new Type[]{typeof(属性类型)} );
myDynamic.Emit();