동적 메서드를 생성하여 생성자의 대리자 표현을 만들려고합니다.이 메서드는 매우 "느슨하게 형식화 된"서명과 일치해야하므로 모든 매개 변수화 된 형식 생성자 :C# 동적 메서드 대리자 매개 변수화 된 생성자를로드하는 데 문제가 발생합니다.
public delegate Object ParamsConstructorDelegate(params object[] parameters);
이 대리자를 만드는 코드를 내가지고있어, 이제 (이 실버입니다주의)처럼
public static ParamsConstructorDelegate CreateDelegate(ConstructorInfo constructor)
{
Guard.ArgumentNotNull(constructor, "constructor");
Guard.ArgumentValue(constructor.GetParameters().Length == 0, MUSTBE_PARAMETERIZED_CONSTRUCTOR);
var _argumentTypes = new Type[] { typeof(object[]) };
var _parameters = constructor.GetParameters();
var _parameterTypes = _parameters.Select((p) => p.ParameterType).ToArray();
var _sourceType = constructor.DeclaringType;
var _method = new DynamicMethod(constructor.Name, _sourceType, _argumentTypes);
var _gen = _method.GetILGenerator();
for (var _i = 0; _i < _parameters.Length; _i++)
{
if (_parameters[_i].IsOut || _parameterTypes[_i].IsByRef)
{
if (_i < 128)
{
_gen.Emit(OpCodes.Ldarga_S, (byte)_i);
}
else
_gen.Emit(OpCodes.Ldarga, _i);
}
else
{
switch (_i)
{
case 0:
_gen.Emit(OpCodes.Ldarg_0, _i);
break;
case 1:
_gen.Emit(OpCodes.Ldarg_1, _i);
break;
case 2:
_gen.Emit(OpCodes.Ldarg_2, _i);
break;
case 3:
_gen.Emit(OpCodes.Ldarg_3, _i);
break;
default:
if (_i < 128)
_gen.Emit(OpCodes.Ldarg_S, (byte)_i);
else
_gen.Emit(OpCodes.Ldarg, _i);
break;
}
}
}
_gen.Emit(OpCodes.Newobj, constructor);
_gen.Emit(OpCodes.Ret); ;
return (ParamsConstructorDelegate)_method.CreateDelegate(typeof(ParamsConstructorDelegate));
}
보인다 "작업 런타임을 불안정하게 할 수있다." 확인 예외, 명백하게 일리노이 잘못, 그래서 누군가가 나를 수정할 수 있기를 바랍니다.
감사합니다.
지역 주민을위한 밑줄 접두사는 내가별로 보지 못한 스타일입니다. –