2011-08-30 2 views
3

.NET 2.0 (C# 3.0)에서는 컴파일 타임에 형식을 알지 못했을 때 속성 접근 자의 대리인을 리플렉션을 통해 어떻게 만들 수 있습니까?속성 유형을 알 수없는 경우 리플렉션을 통해 얻은 속성 acessor에 대한 대리자 만들기

예.

Func<int> getter = (Func<int>)Delegate.CreateDelegate(
    typeof(Func<int>), 
    this, property.GetGetMethod(true)); 
Action<int> setter = (Action<int>)Delegate.CreateDelegate(
    typeof(Action<int>), 
    this, property.GetSetMethod(true)); 

을하지만 속성이 컴파일시에 어떤 방식을 모르는 경우, 나는 그것을 할 방법을 모르는 : I 형 int의 재산이있는 경우, 나는이 작업을 수행 할 수 있습니다.

+1

잘 모르겠지만 다음 질문과 관련이 있습니다. http://stackoverflow.com/questions/773099/generating-delegate-types-dynamically-in-c – Till

+0

'Func '은 .NET 3.5 ....입니다. 이 사용자 정의'Func '? –

+0

@Marc Gravell - Whoops는 잘못된 플랫폼을 대상으로하는 스크래치 프로젝트에서 실제로 놀고 있었지만 .NET 2.0에서는 사용자 지정 Func 으로 작동합니다. – Ergwun

답변

2

는 당신이 필요로하는 것은 :

Delegate getter = Delegate.CreateDelegate(
    typeof(Func<>).MakeGenericType(property.PropertyType), this, 
    property.GetGetMethod(true)); 
Delegate setter = Delegate.CreateDelegate(
    typeof(Action<>).MakeGenericType(property.PropertyType), this, 
    property.GetSetMethod(true)); 

그러나, 당신은 당신이 slooow입니다 DynamicInvoke()를 사용할 필요가 있기 때문에, 당신은 여전히 ​​짧은 올거야 성능을 위해이 일을하는 경우. object을 가져 오거나 반환하는 래퍼를 작성하려면 메타 프로그래밍을 살펴 보는 것이 좋습니다. 또는이 작업을 수행하는 HyperDescriptor를보십시오.

+0

http://stackoverflow.com/questions/2490828/createdelegate-with-unknown-types는 어떨까요? – Till

+0

@ 받아 들일 수있는 대답을 의미하는 경우 ... 미리 유형을 모른다면'MakeGenericMethod()'를 사용해야 할 것입니다; 그런 다음 리플렉션을 사용하여 즉시 한 번 사용하고 폐기하는 대리인을 만듭니다. 솔직히,이 예제에서 raw reflection ('GetValue()'/'SetValue()')이 더 좋았을 것입니다. –

+0

@Marc Gravel - 네, 성능 향상을 위해 노력하고있었습니다. 내가 더 많은 시간을 가질 때 나는 HyperDescriptor를 체크 아웃 할 것이다. – Ergwun

관련 문제