1

我正在尝试确定返回类型中涉及的字段列表(在这种情况下,来自 Ob 类的“字符串 MyName”和“字符串 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;
    }
}
4

3 回答 3

1

这些是属性还是字段?

对于属性,它真的很简单,就像您已经检索方法一样。

PropertyInfo[] pi = myClType.GetProperties();

对于字段,类似这样的内容(对 BindingFlags 参数使用按位或):

myClType.GetFields(BindingFlags.Public | BindingFlags.NonPublic);
于 2013-07-11T19:45:44.793 回答
1

我想你要找的是methodInfo.ReturnType.GetFields()

于 2013-07-11T19:50:18.953 回答
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();
}
于 2013-07-11T19:56:32.580 回答