익명 호출자가 포함될 수있는 호출자 제공 객체에 임의 필드를 설정할 수있는 코드를 작성하려고합니다. 델리게이트 생성은 불가능합니다 (Expression 컴파일러는 익명 객체의 필드가 읽기 전용이라는 것을 인식합니다). 그래서 IL을 일부 방출했습니다. 그러나이 작업을 수행 할 때 VerificationException ("작업으로 인해 런타임이 불안정해질 수 있음)이 실행 중입니다. 동일한 간단한 코드가 일반 필드가있는 객체에서 잘 실행됩니다. 읽기 전용 필드에서 실패합니다. 그 밖의 무엇을 여기서 할 수 있습니까? .Net 4.6.2를 실행 중입니다.읽기 전용 필드 (C#)를 설정할 때의 VerificationException
미리 감사드립니다.
class TestRegular
{
private string field;
}
class TestReadOnly
{
private readonly string field;
}
class Program
{
static void Main(string[] args)
{
Verify(new TestRegular()); // this works
Verify(new TestReadOnly()); // this does not work
Verify(new { field = "abc" }); // this does not work
Console.WriteLine("Done");
}
private static void Verify<T>(T test)
{
var fields = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
Action <T, object> setter = CompileSetter<T>(fields[0]);
setter(test, "value");
}
private static Action<TResult, object> CompileSetter<TResult>(FieldInfo field)
{
string methodName = field.ReflectedType.FullName + ".TestSetter";
DynamicMethod setterMethod = new DynamicMethod(methodName, null, new[] { typeof(TResult), typeof(object) }, true);
ILGenerator gen = setterMethod.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Castclass, field.FieldType);
gen.Emit(OpCodes.Stfld, field);
gen.Emit(OpCodes.Ret);
return (Action<TResult, object>)setterMethod.CreateDelegate(typeof(Action<TResult, object>));
}
}