gpt4 book ai didi

.net - 我怎样才能使它与深层属性一起工作

转载 作者:行者123 更新时间:2023-12-02 02:33:31 26 4
gpt4 key购买 nike

给定以下代码...

class Program {

static void Main(string[] args) {

Foo foo = new Foo { Bar = new Bar { Description= "Martin" }, Name = "Martin" };

DoLambdaStuff(foo, f => f.Name);
DoLambdaStuff(foo, f => f.Bar.Description);

}

static void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) {

// Set up and test "getter"...

Func<TObject, TValue> getValue = expression.Compile();

TValue stuff = getValue(obj);

// Set up and test "setter"...

ParameterExpression objectParameterExpression = Expression.Parameter(typeof(TObject)), valueParameterExpression = Expression.Parameter(typeof(TValue));
Expression<Action<TObject, TValue>> setValueExpression = Expression.Lambda<Action<TObject, TValue>>(
Expression.Block(
Expression.Assign(Expression.Property(objectParameterExpression, ((MemberExpression)expression.Body).Member.Name), valueParameterExpression)
), objectParameterExpression, valueParameterExpression
);
Action<TObject, TValue> setValue = setValueExpression.Compile();


setValue(obj, stuff);

}

}

class Foo {

public Bar Bar { get; set; }
public string Name { get; set; }

}

class Bar {

public string Description{ get; set; }

}

DoLambdaStuff(foo, f => f.Name) 的调用工作正常,因为我正在访问一个浅层属性,但是对 DoLambdaStuff(foo, f => f. Bar.Description) 失败 - 虽然 getValue 函数的创建工作正常,但 setValueExpression 的创建失败,因为我试图访问的深层属性对象。

谁能帮我修改一下,以便我可以为深层属性和浅层属性创建 setValueExpression

谢谢。

最佳答案

您需要利用您的 expression.Body 已经代表您要设置的属性这一事实。这意味着您可以使用 expression.Body 作为赋值表达式的左侧:

    public static void Main(string[] args)
{
Foo foo = new Foo { Bar = new Bar { Name = "Martin", Buzz = new Fiz() { Name = "Carl" }}, Name = "Martin" };

DoLambdaStuff(foo, f => f.Bar.Name, "Dennis");
DoLambdaStuff(foo, f => f.Bar.Buzz.Name, "Dennis");
Console.WriteLine(foo.Bar.Name);
Console.WriteLine(foo.Bar.Buzz.Name);

}
static void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression, TValue valueToSet)
{
// Getter.
Func<TObject, TValue> getter = expression.Compile();
TValue stuff = getter(obj);

ParameterExpression pObj = expression.Parameters[0];
ParameterExpression pValue = Expression.Parameter(typeof (TValue), "value");
var setterBlock = Expression.Block(
Expression.Assign(expression.Body, pValue)
);

var setterExpression = Expression.Lambda<Action<TObject, TValue>>(setterBlock, pObj, pValue);
Action<TObject, TValue> setter = setterExpression.Compile();

// Test
setter(obj,valueToSet);
}

关于.net - 我怎样才能使它与深层属性一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2843290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com