gpt4 book ai didi

c# - 将 C# 表达式树编译成方法时,是否可以访问 "this"?

转载 作者:行者123 更新时间:2023-11-30 12:19:45 26 4
gpt4 key购买 nike

我正在尝试动态生成一个实现给定接口(interface)的类。因此,我需要实现一些方法。我想避免直接发出 IL 指令,所以我尝试使用表达式树和 CompileToMethod。不幸的是,其中一些方法需要访问生成类的一个字段(就像我将 this.field 写入我正在实现的方法中一样)。是否可以使用表达式树访问“this”? (“this”是指将调用该方法的对象。)

如果是,这样的方法与表达式树会是什么样子?

int SomeMethod() {
return this.field.SomeOtherMethod();
}

最佳答案

Expression.ConstantParameterExpression 是你的 friend ;示例:

var obj = Expression.Constant(this);
var field = Expression.PropertyOrField(obj, "field");
var call = Expression.Call(field, field.Type.GetMethod("SomeOtherMethod"));
var lambda = Expression.Lambda<Func<int>>(call);

或:

var obj = Expression.Parameter(typeof(SomeType));
var field = Expression.PropertyOrField(obj, "field");
var call = Expression.Call(field, field.Type.GetMethod("SomeOtherMethod"));
var lambda = Expression.Lambda<Func<SomeType, int>>(call, obj);

(在后一种情况下,您会将 this 作为参数传入,但这意味着您可以存储 lambda 并将其重新用于不同的目标实例对象)

如果你的名字是固定的,这里的另一个选项可能是dynamic:

dynamic obj = someDuckTypedObject;
int i = obj.field.SomeOtherMethod();

关于c# - 将 C# 表达式树编译成方法时,是否可以访问 "this"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56048736/

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