【问题标题】:How do you determine if a method returns a dynamic type when using reflection?使用反射时如何确定方法是否返回动态类型?
【发布时间】:2012-01-16 09:48:36
【问题描述】:

使用反射时,可以检查 DynamicAttribute 属性的字段、属性、索引器和参数,以确定它们是否具有动态类型。但是,这对方法不起作用——即使它们返回“动态”,它们也没有属性,并且它们的返回类型是“对象”(并且也没有属性)。 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; }
    }
}

【问题讨论】:

    标签: c# reflection dynamic


    【解决方案1】:

    这是因为您需要从方法中检查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!!"));
    }
    

    这可能需要一些防御性编码,但这只是一个快速而肮脏的概念证明。

    【讨论】:

    • 太棒了!谢谢,戴夫!!你应该为此喝一品脱吉尼斯啤酒。
    猜你喜欢
    • 2015-08-08
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多