使用C#在运行时读取参数,属性和返回类型的一种方法

时间:2011-02-07 16:55:58

标签: dynamic methodinfo propertyinfo parameterinfo

继续我之前的帖子Using reflection read properties of an object containing array of another object。我希望从EvgK中创建一个通用方法,可以在我的代码库中的多个位置使用。

public static void GetMyProperties(object obj)
{
    List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>();
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties())
    {

        if (!Helper.IsCustomType(pinfo.PropertyType))
        {
            //add properties - name, value, type to the list
        }
        else
        {
            var getMethod = pinfo.GetGetMethod();

            if (getMethod.ReturnType.IsArray)
            {
                var arrayObject = getMethod.Invoke(obj, null);
                foreach (object element in (Array)arrayObject)
                {
                    foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties())
                    {
                        //add properties - name, value, type to the list
                    }
                }
            }
            else
            {
                List<MyPropertyInfo> oTempMyProp = GetMyProperties(prop.GetValue(obj, null));
                oMyProp.AddRange(oTempMyProp);
            }
        }


    }
}

同样,我正在尝试阅读用户传递的方法。我列出了参数,它们的属性和值。一旦用户提供输入值,我就动态调用该方法来获取结果对象。结果传递给GetMyProperties()方法,方法列出所有属性(到n级) - 名称,值和类型。

目前,我有两种方法(下面的定义):

public List<MyPropertyInfo> GetMyProperties(Type type);

public List<MyPropertyInfo> GetMyProperties(object obj);

我使用第一个显示所选方法的所有参数列表及其属性 - 名称,值和类型。

MethodInfo members = type.GetMethod(this.MethodName);
ParameterInfo[] parameters = members.GetParameters();
List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>();
foreach (var parameter in parameters)
{
    oMyProp = GetMyProperties(parameter.ParameterType);    
}

..创建我的属性列表,以便用户可以输入参数。我传递ParameterType和GetProperties方法检查它是否是自定义类型。如果是自定义类型,则它会以递归方式调用自身,以构建一个绑定到网格以供输入的列表。

第二种方法GetMyProperties(object obj)用于列出返回对象。因为我不知道编译时所选方法的返回类型,所以使用对象类型。我想知道我是否可以以某种方式修改第二种方法来使用它来读取参数,属性和返回类型?而不是有单独的方法?试图重用代码。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但如果你想将两种方法合二为一,你可以在两种情况下传递对象,但检查对象是否为Type,并为这种情况提供不同的逻辑:

public static void GetMyProperties(object obj)
{
   if (obj is Type)
   {
      Type type = obj as Type;
      ... here is the first method logic ...
   } 
   else 
   {
      ... here is the second method logic ...
   }
}