2014-11-18 2 views
1

마침내 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 

그렇다면 왜 개발자가 이런 종류의 사용을 허용하지 않기로 결정 했는가?

+0

실제 문제가 이해가되지 않습니다. 나는 당신이 메소드에 값을 설정하려고하기 때문에 당신이하고 싶은 것을 의사 코드로 받아 들인다. 당신이 이것을하려고 노력 했습니까? http://stackoverflow.com/a/9945057/359157 – TyCobb

+0

pseudo에 신경 쓰지 마라. 나는 단지'__refvalue'가 문서화되지 않은 키워드라는 것을 알았다. – TyCobb

+0

@TyCobb 아니, 왜 단지 일부 기능이 완벽하게 구현되지 않았는지에 대한 이론적 인 질문 일뿐입니다. 모든 것이 잘 작동합니다. – IllidanS4

답변

1

비난 Plato ...

그것은 어떤 ref (관리 포인터) 기준의 성격에 내재되어

- 당신이 관찰하고, TypedReference 것을 당신이 사용할 수 있습니다 - # 7 ref local and ref return 기능은 새로운 C 포함 이고 입니다. 그게 전부가 아니기 때문에? CTS가 지배 아웃 할 수 없기 때문에 그 가능성 중 하나를

지금, 강한 타이핑 모든 refType은 유형 계층 구조에 아래 및 위의 두 에서 제한해야합니다.

는 더 공식적으로 Type은 그렇지 않으면 자격이 될하는 다형성 covariance and contravariance교차로로 제한됩니다. 분명히이 교차 결과는 하나의 Type으로 무너져 그 자체가 무의미합니다.

관련 문제