2011-12-09 3 views
3

リフレクションを使用する場合、フィールドにダイナミックタイプがあるかどうかを判断するために、DynamicAttribute属性のフィールド、プロパティ、インデクサ、およびパラメータを調べることができます。しかし、これはメソッドでは機能しません。たとえ '動的'を返しても、属性がなく、戻り値の型は 'object'です(属性もありません)。 Visual Studioは、外部アセンブリのメソッドのインテリセンスのためにこれを行います...リフレクションで行うことはできますか?例えばリフレクションを使用しているときにメソッドが動的な型を返すかどうかをどのように判断しますか?

は、以下のコードは、この出力を生成します

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

例コード:

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

あなたがメソッドからReturnTypeCustomAttributesの属性を確認する必要があるためです。

はそうのようなあなたの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 !!あなたはギネスのパイントに値するでしょう。 –

関連する問題