C# 如何获得表达<;系统功能<;TEntity,TEntity>&燃气轮机;我什么时候有表情?

C# 如何获得表达<;系统功能<;TEntity,TEntity>&燃气轮机;我什么时候有表情?,c#,entity-framework,generics,expression-trees,C#,Entity Framework,Generics,Expression Trees,我正在研究一个服务的通用补丁方法 public virtual void Patch ( int id, Delta<TEntityView> view ) { var type = typeof( TEntity ); TEntity model = Activator.CreateInstance( type ) as TEntity; foreach( var changedProperty in view.GetChangedPropertyName

我正在研究一个服务的通用补丁方法

public virtual void Patch ( int id, Delta<TEntityView> view )
{
    var type = typeof( TEntity );
    TEntity model = Activator.CreateInstance( type ) as TEntity;

    foreach( var changedProperty in view.GetChangedPropertyNames() )
    {
        var property = type.GetProperty( changedProperty );
        var propertyType = property.PropertyType;
        var retreived = view.TryGetPropertyValue( changedProperty, out object propval );

        if ( retreived && property != null )
        {
            property.SetValue( model, propval, null );
        }
    }

    UnitOfWork.Query<TEntity>( e => e.Id == id )
        .Update( m => model );
}
我改变了我的方法如下:

public virtual void Patch ( int id, Delta<TEntityView> view )
{
    var type = typeof( TEntity );
    var bindings = new List<MemberBinding>();

    foreach( var changedProperty in view.GetChangedPropertyNames() )
    {
        var property = type.GetProperty( changedProperty );
        var propertyType = property.PropertyType;
        var retreived = view.TryGetPropertyValue( changedProperty, out object propval );

        if ( retreived && property != null )
        {
            bindings.Add( Expression.Bind( type.GetMember( changedProperty )[0], Expression.Constant( propval ) ) );
        }
    }

    Expression ex = Expression.MemberInit( Expression.New( type ), bindings );

    // Expression <-- have this
    // Expression<Func<TModel, TModel>> updateFactory <-- need this

    UnitOfWork.Query<TEntity>( e => e.Id == id )
        .Update( ex );
}
公共虚拟无效修补程序(int-id,增量视图)
{
变量类型=类型(强度);
var bindings=newlist();
foreach(视图中的var changedProperty.GetChangedPropertyNames())
{
var属性=type.GetProperty(changedProperty);
var propertyType=property.propertyType;
var retrieved=view.TryGetPropertyValue(changedProperty,out object propval);
if(检索和属性!=null)
{
Add(Expression.Bind(type.GetMember(changedProperty)[0],Expression.Constant(propval));
}
}
Expression ex=Expression.MemberInit(Expression.New(type),绑定);

//Expression你做了硬的部分,乍一看它是正确的,你想要的是用lambda把它包起来,这样像x=>ex这样的部分:

var parameter = Expression.Parameter(type,"x");
var lambda = Expression.Lambda<Func<TEntity,TEntity>>(ex, parameter);
UnitOfWork.Query<TEntity>( e => e.Id == id )
    .Update( lambda );
var参数=表达式参数(类型为“x”);
var lambda=表达式.lambda(ex,参数);
UnitOfWork.Query(e=>e.Id==Id)
.更新(lambda);

(从内存中写入以便验证)

您完成了最难的部分,乍一看它看起来是正确的,您要做的是将其用lambda包装,以便像x=>ex这样的部分:

var parameter = Expression.Parameter(type,"x");
var lambda = Expression.Lambda<Func<TEntity,TEntity>>(ex, parameter);
UnitOfWork.Query<TEntity>( e => e.Id == id )
    .Update( lambda );
var参数=表达式参数(类型为“x”);
var lambda=表达式.lambda(ex,参数);
UnitOfWork.Query(e=>e.Id==Id)
.更新(lambda);

(从记忆中写出来以供验证)

你的记忆力很好!它工作得很好。谢谢!我知道我遗漏了一些小东西:)你的记忆力很好!它工作得很好。谢谢!我知道我遗漏了一些小东西:)