Один метод для чтения параметров, свойств и возвращаемых типов во время выполнения с использованием C # - PullRequest
0 голосов
/ 07 февраля 2011

С продолжением моего предыдущего потока Используя отражение, считайте свойства объекта, содержащего массив другого объекта . Я надеюсь сделать этот замечательный метод из 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 голосов
/ 08 февраля 2011

Я не уверен, что правильно вас понимаю, но если вы хотите объединить два метода в одном, вы можете передать объект в обоих случаях, но проверьте, является ли объект Типом или нет, и предоставьте другую логику для этих случаев:

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 ...
   }
}
...