마침내 TypedReference.MakeTypedReference
메소드의 사용법을 이해했지만 인수가 제한적이었습니다. 기본 개인 InternalMakeTypedReference(void* result, object target, IntPtr[] flds, RuntimeType lastFieldType)
은 필드 배열이 요소를 가지며 필드 유형이 비 프리미티브가되도록 제한하는 MakeTypedReference
보다 훨씬 많은 작업을 수행 할 수 있습니다.TypedReference.MakeTypedReference가 왜 제한적입니까?
: 그것은 MethodInfo
에서 호출 할 수 없으며 하나 개의 매개 변수가 RuntimeType
이기 때문에, 실제로는 더 해킹을 필요로 호출, 불행하게도
private static readonly MethodInfo InternalMakeTypedReferenceMethod = typeof(TypedReference).GetMethod("InternalMakeTypedReference", flags);
private static readonly Type InternalMakeTypedReferenceDelegateType = ReflectionTools.NewCustomDelegateType(InternalMakeTypedReferenceMethod.ReturnType, InternalMakeTypedReferenceMethod.GetParameters().Select(p => p.ParameterType).ToArray());
private static readonly Delegate InternalMakeTypedReference = Delegate.CreateDelegate(InternalMakeTypedReferenceDelegateType, InternalMakeTypedReferenceMethod);
public static void MakeTypedReference([Out]TypedReference* result, object target, params FieldInfo[] fields)
{
IntPtr ptr = (IntPtr)result;
IntPtr[] flds = new IntPtr[fields.Length];
Type lastType = target.GetType();
for(int i = 0; i < fields.Length; i++)
{
var field = fields[i];
if(field.IsStatic)
{
throw new ArgumentException("Field cannot be static.", "fields");
}
flds[i] = field.FieldHandle.Value;
lastType = field.FieldType;
}
InternalMakeTypedReference.DynamicInvoke(ptr, target, flds, lastType);
}
을 따라서 델리게이트 형식을 동적으로 생성해야합니다 (DynamicMethod
도 사용할 수 있음).
이제 어떻게 될 수 있습니까? 그것은 제한없이 모든 객체의 모든 값의 모든 필드 (클래스 또는 구조체 유형, 심지어 원시 유형)에 액세스 할 수 있습니다. 또한 boxed value 유형에 대한 참조를 만들 수 있습니다.
object a = 98;
TypedReference tr;
InteropTools.MakeTypedReference(&tr, a);
Console.WriteLine(__refvalue(tr, int)); //98
__refvalue(tr, int) = 1;
Console.WriteLine(a); //1
그렇다면 왜 개발자가 이런 종류의 사용을 허용하지 않기로 결정 했는가?
실제 문제가 이해가되지 않습니다. 나는 당신이 메소드에 값을 설정하려고하기 때문에 당신이하고 싶은 것을 의사 코드로 받아 들인다. 당신이 이것을하려고 노력 했습니까? http://stackoverflow.com/a/9945057/359157 – TyCobb
pseudo에 신경 쓰지 마라. 나는 단지'__refvalue'가 문서화되지 않은 키워드라는 것을 알았다. – TyCobb
@TyCobb 아니, 왜 단지 일부 기능이 완벽하게 구현되지 않았는지에 대한 이론적 인 질문 일뿐입니다. 모든 것이 잘 작동합니다. – IllidanS4