Объект типа «System.Reflection.ParameterInfo» не может быть преобразован в тип «System.Int32» - PullRequest
0 голосов
/ 19 мая 2009

Я пытаюсь написать метод расширения для объектов, который будет выводить структуру объекта в выходные данные отладки. Я сталкиваюсь с проблемой, когда свойствоInfo проиндексировано (GetIndexParameters (). Длина> 0).

Я пытался использовать следующее:

object value = propInfo.GetValue(myObject, propInfo.GetIndexParameteres());

это приводит к следующей ошибке во время выполнения:

  • Объект типа 'System.Reflection.ParameterInfo' не может быть преобразован в тип 'System.Int32'

У кого-нибудь есть идеи? Полный код метода приведен ниже:

[System.Diagnostics.Conditional("DEBUG")]
public static void DebugObject(this object debugObject)
{
    System.Diagnostics.Debug.WriteLine("Debugging object: " + debugObject.GetType().Namespace);
    System.Diagnostics.Debug.WriteLine(String.Format("> {0}", debugObject.GetType()));
    System.Diagnostics.Debug.Indent();
    try
    {
        if (debugObject.GetType().IsArray)
        {
            object[] array = ((object[])debugObject);

            for (int index = 0; index < array.Length; index++)
            {
                System.Diagnostics.Debug.WriteLine(String.Format("- {{0}} = [{1}]", index, array[index]));
            }
            return;
        }

        object value = null;
        foreach (System.Reflection.PropertyInfo propInfo in debugObject.GetType().GetProperties())
        {
            try
            {
                if (propInfo.IsIndexed())
                {
                    System.Diagnostics.Debug.WriteLine(propInfo.ReflectedType.IsArray + " is indexed");
                    // THIS IS WHERE IT CHOKES.  As an example, try sending in something of type System.Net.Mail.MailMessage;
                    value = propInfo.GetValue(debugObject, propInfo.GetIndexParameters());
                }
                else
                {
                    value = propInfo.GetValue(debugObject, null);
                }

                if (value != null)
                {
                    System.Diagnostics.Debug.WriteLine(String.Format("> {0} = [{1}]", propInfo.Name, value));

                    if (
                            (value.GetType() != typeof(string))
                            &&
                            (value.GetType() != typeof(int))
                        )
                    {
                        value.DebugObject();
                    }
                }
            }
            catch (System.Reflection.TargetParameterCountException tpce)
            {
                System.Diagnostics.Debug.WriteLine(
                    String.Format(
                        "> Could not run GetValue for {1} (type '{0}', '{2}') because of incorrect prarmeters", 
                        propInfo.GetType().ToString(),
                        propInfo.Name,
                        propInfo.PropertyType.Namespace
                        )
                    );
            }
        }
    }
    finally
    {
        System.Diagnostics.Debug.Unindent();
    }
}

Ответы [ 2 ]

1 голос
/ 19 мая 2009

Это плохая идея сбросить свойства индексатора. Это похоже на «метод дампа». Это просто невозможно.

Также рассмотрите возможность использования PropertyInfo.CanRead, прежде чем пытаться получить значение.

0 голосов
/ 19 мая 2009

Вы пытаетесь получить доступ к SomeProp [foo, bar ...] ... так; Каковы разумные значения индекса? Для целых чисел может быть 0,0,0 ... безопасно, а может и нет. Это зависит от контекста. Лично я не уверен, что это лучший путь; Я мог бы взглянуть на IList на основном объекте, но кроме этого - просто взглянуть на обычные свойства ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...