これは学習の練習です。私はFooと文字列を取り、Aプロパティを設定するメソッドを作成しました。私は、リフレクター分解を使用して、次の放射コードを作成しました。解体は、次のようになります。DynamicMethodを作成してプロパティに値を割り当てますか?
.method private hidebysig static void Spork(class ConsoleTesting.Foo f, string 'value') cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: callvirt instance void ConsoleTesting.Foo::set_A(string)
L_0007: ret
}
[OK]を、ので、私はその後、私のEMITコードをモデル化:私はこの例外を取得してい
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
namespace ConsoleTesting
{
class Foo
{
public string A { get; set; }
}
class Program
{
static Action<Foo, string> GenMethodAssignment(string propName)
{
MethodInfo setMethod = typeof(Foo).GetMethod("get_" + propName);
if (setMethod == null)
throw new InvalidOperationException("no property setter available");
Type[] argTypes = new Type[] { typeof(Foo), typeof(String) };
DynamicMethod method = new DynamicMethod("__dynamicMethod_Set_" + propName, null, argTypes, typeof(Program));
ILGenerator IL = method.GetILGenerator();
IL.Emit(OpCodes.Ldarg_0);
IL.Emit(OpCodes.Ldarg_1);
IL.Emit(OpCodes.Callvirt, setMethod);
IL.Emit(OpCodes.Ret);
method.DefineParameter(1, ParameterAttributes.In, "instance");
method.DefineParameter(2, ParameterAttributes.In, "value");
Action<Foo, string> retval = (Action<Foo, string>)method.CreateDelegate(typeof(Action<Foo, string>));
return retval;
}
static void Main(string[] args)
{
Foo f = new Foo();
var meth = GenMethodAssignment("A");
meth(f, "jason");
Console.ReadLine();
}
}
:
JIT Compiler encountered an internal limitation.
krunkがあることは何私はそれをどのように修正するのですか?
EDIT:
私はターゲットメソッドがプライベートであるので、多分それはだと思ったが、私はそうはわかりません。 DynamicMethod MSDN page:
次のコード例は、論理的に型に関連付けられたDynamicMethodを作成します。この関連付けによって、そのタイプのプライベートメンバーにアクセスできます。
"get_"メソッドにアクセスしています。これはあなたの投稿の入力ミスですか?名前でプロパティにアクセスし、PropertyInfoオブジェクトでGetSetMethod()メソッドを使用できます。この方法では、 "get_"と "set_"というC#の規約に頼っているわけではありません。 –
しかし、今私は打ち間違いを訂正しました。 ILにはAの代わりにAStrが含まれていました。なぜなら私はこのポストの目的のためにプロパティの名前を変更したからです。 – Amy
ああ、私はあなたのコメントの最初の文を誤解しました。あなたは絶対に正しいです。 – Amy