是否可以在 C#(或可能的其他 .NET 语言)中创建动态方法作为现有类型的实例方法,并可以访问“this”引用、私有和受保护成员?
在不规避可见性限制的情况下,对私有/受保护成员的合法访问对我来说非常重要,因为 DynamicMethod 可以做到这一点。
Expression.Lambda CompileToMethod(MethodBuilder) 调用对我来说看起来非常复杂,我还没有找到一种方法来为已经存在的类型/模块创建合适的 MethodBuilder
编辑:我现在从表达式树创建了一个副本 Action<DestClass, ISourceClass>,就像一个静态/扩展方法。无论如何,Expression.Property(...) 访问是由反射 (PropertyInfo) 定义的,如果通过反射定义,我可以访问私有/受保护成员。不如 DynamicMethod 和发出的 IL 好,其中生成的方法表现得像具有可见性检查的成员(甚至比普通的 C# 复制代码快一点),但表达式树似乎更易于维护。
像这样,在使用 DynamicMethod 和 Reflection.Emit 时:
public static DynamicMethod GetDynamicCopyValuesMethod()
{
var dynamicMethod = new DynamicMethod(
"DynLoad",
null, // return value type (here: void)
new[] { typeof(DestClass), typeof(ISourceClass) },
// par1: instance (this), par2: method parameter
typeof(DestClass));
// class type, not Module reference, to access private properties.
// generate IL here
// ...
}
// class where to add dynamic instance method
public class DestClass
{
internal delegate void CopySourceDestValuesDelegate(ISourceClass source);
private static readonly DynamicMethod _dynLoadMethod =
DynamicMethodsBuilder.GetDynamicIlLoadMethod();
private readonly CopySourceDestValuesDelegate _copySourceValuesDynamic;
public DestClass(ISourceClass valuesSource) // constructor
{
_valuesSource = valuesSource;
_copySourceValuesDynamic =
(LoadValuesDelegate)_dynLoadMethod.CreateDelegate(
typeof(CopySourceDestValuesDelegate), this);
// important: this as first parameter!
}
public void CopyValuesFromSource()
{
copySourceValuesDynamic(_valuesSource); // call dynamic method
}
// to be copied from ISourceClass instance
public int IntValue { get; set; }
// more properties to get values from ISourceClass...
}
此动态方法可以通过完整的可见性检查访问 DestClass 私有/受保护成员。
编译表达式树时是否有任何等价物?