「this」参照、プライベート、および保護されたメンバーにアクセスして、既存の型のインスタンス メソッドとして C# (または他の .NET 言語) で動的メソッドを作成することは可能ですか?
可視性の制限を回避することなく、プライベート/保護されたメンバーへの正当なアクセスは、DynamicMethod で可能になるため、私にとって非常に重要です。
Expression.Lambda CompileToMethod(MethodBuilder) 呼び出しは非常に複雑に見えますが、既存の型/モジュールに対して適切な MethodBuilder を作成する方法をまだ見つけることができませんでした
編集: 式ツリーから、静的/拡張メソッドのように、Action<DestClass, ISourceClass> のコピーを作成しました。いずれにせよ Expression.Property(...) アクセスは Reflection (PropertyInfo) によって定義され、Reflection を介して定義されている場合は、プライベート/保護されたメンバーにアクセスできます。生成されたメソッドが可視性チェックを備えたメンバーのように動作する (通常の C# コピー コードよりも少し高速である) DynamicMethod および発行された IL ほど良くはありませんが、式ツリーは維持するのにはるかに優れているようです。
このように、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 のプライベート/保護されたメンバーにアクセスできます。
式ツリーをコンパイルするときに同等のものはありますか?