关于返回类型的反思以获取字段及其文档字符串?

时间:2013-07-11 19:39:30

标签: c# .net reflection

我正在尝试确定返回类型中涉及的字段列表(在本例中为“字符串MyName”和来自类Ob的“字符串MyAddress”以及它们各自的文档字符串)。

我到了获得返回类型的阶段,但我尝试的其他任何事情都是给我空白值或抛出异常。有什么建议吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace SampleProf
{
    class Program
    {

        static void Main(string[] args)
        {
            Sample cl = new Sample();
            Type myClType = cl.GetType();

            MethodInfo[] methodsInfo = myClType.GetMethods();

            List<string> MethodList = new List<string>();

            // Iterate through all methods
            foreach (MethodInfo methodInfo in methodsInfo)
            {
                if (methodInfo.IsPublic && methodInfo.Name.Contains("Get") && !methodInfo.Name.Contains("GetType"))
                {
                    if (methodInfo.ReturnType != typeof(void))
                    {
                        // Do something here?
                    }
                }
            }

            Console.Read();
        }

    }

    public class Sample
    {
        public Ob GetMe()
        {
            return null;
        }
    }

    public class Ob
    {
        /// <summary>My name</summary>
        string MyName;
        /// <summary>My address</summary>
        string MyAddress;
    }
}

3 个答案:

答案 0 :(得分:1)

这些属性或字段?

对于属性,它非常简单,就像你已经检索过方法一样。

PropertyInfo[] pi = myClType.GetProperties();

对于Fields,类似这样(对BindingFlags参数使用按位OR):

myClType.GetFields(BindingFlags.Public | BindingFlags.NonPublic);

答案 1 :(得分:1)

我认为您正在寻找的是methodInfo.ReturnType.GetFields()

答案 2 :(得分:0)

获得MethodInfo个对象数组后,可以继续迭代数组中的每个元素,查询MethodInfo.ReturnType属性以确定每个函数返回的类型。

获得Type的实例后,很容易反映其中包含的字段并分别打印其类型和名称。

在适当的时候,我用适当的BindingFlags替换了你有点麻烦的条件。您不再需要检查方法是否公开,也不需要检查方法是否被称为“GetType”

static void Main(string[] args)
{
    Sample sampleInstance = new Sample();
    Type sampleType = sampleInstance.GetType();

    MethodInfo[] sampleMethods = 
        sampleType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

    foreach (MethodInfo method in sampleMethods)
    {
        var methodReturnType = method.ReturnType;

        if (methodReturnType == typeof(void)) 
            break;

        Console.WriteLine(methodReturnType.FullName);

        foreach (FieldInfo field in methodReturnType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
        {
            Console.WriteLine("  {0}: {1}",  field.DeclaringType, field.Name);       
        }
    }

    Console.Read();
}