2011-12-09 3 views
3

리플렉션을 사용할 때 DynamicAttribute 특성에 대해 필드, 속성, 인덱서 및 매개 변수를 검사하여 동적 유형이 있는지 확인할 수 있습니다. 그러나 메소드에 대해서는 작동하지 않습니다. '동적'을 반환하더라도 속성이없고 반환 유형이 '객체'이며 속성도 없습니다. Visual Studio는 외부 어셈블리의 메서드에 대한 인텔리 센스를 위해 이것을 수행합니다 ... 리플렉션으로 수행 할 수 있습니까?리플렉션을 사용할 때 메서드에서 동적 유형을 반환하는지 어떻게 결정합니까?

dynamicField is dynamic 
DynamicProperty is dynamic 
Item is dynamic 
DynamicMethod is NOT dynamic!! 
dynamicParameter is dynamic 

예제 코드 :

예를 들어

, 아래의 코드는이 출력을 생성 당신이 방법에서 ReturnTypeCustomAttributes의 속성을 확인해야하기 때문에

using System; 
using System.Reflection; 
using System.Runtime.CompilerServices; 

namespace ReflectDynamics 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var test = typeof(Test); 
      CheckDynamic(test.GetField("dynamicField")); 
      CheckDynamic(test.GetProperty("DynamicProperty")); 
      CheckDynamic(test.GetProperty("Item")); 
      MethodInfo dynamicMethod = test.GetMethod("DynamicMethod"); 
      CheckDynamic(dynamicMethod); 
      CheckDynamic(dynamicMethod.GetParameters()[0]); 
      Console.ReadKey(); 
     } 

     static void CheckDynamic(MemberInfo memberInfo) 
     { 
      bool isDynamic = memberInfo.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0; 
      Console.WriteLine(memberInfo.Name + (isDynamic ? " is dynamic" : " is NOT dynamic!!")); 
     } 
     static void CheckDynamic(ParameterInfo parameterInfo) 
     { 
      bool isDynamic = parameterInfo.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0; 
      Console.WriteLine(parameterInfo.Name + (isDynamic ? " is dynamic" : " is NOT dynamic!!")); 
     } 
    } 

    class Test 
    { 
     public dynamic dynamicField; 
     public dynamic DynamicProperty { get { return dynamicField; } } 
     public dynamic this[int index] { get { return dynamicField; } } 
     public dynamic DynamicMethod(dynamic dynamicParameter) { return dynamicField; } 
    } 
} 

답변

4

입니다 .

지금처럼 CheckDynamic 방법을 수정

static void CheckDynamic(MemberInfo memberInfo) 
{ 
    bool isDynamic = memberInfo.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0; 

    var methodInfo = (memberInfo as MethodInfo); 
    if (methodInfo != null) 
    { 
     isDynamic = methodInfo.ReturnTypeCustomAttributes.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0; 
    } 

    Console.WriteLine(memberInfo.Name + (isDynamic ? " is dynamic" : " is NOT dynamic!!")); 
} 

이것은 아마 방어적인 코딩을 필요로하지만, 개념의 단지 신속하고 더러운 증거입니다.

+1

굉장! 고마워, Dave !! 당신은 기네스 한 잔을받을 자격이 있습니다. –

관련 문제