PropertyInfo. GetValue () - как Вы индексируете в универсальный параметр с помощью отражения в C#?

Включаете ли вы определенные библиотеки DLL в свою установку?

Если это так, то это неправильный путь. Вместо этого вы должны включить распространяемый пакет MS для вашего компилятора. Например, если вы компилируете с использованием MSVC 8.0 с пакетом обновления 1 (SP1), вы получите этот пакет и установите его вместе с приложением:

Распространяемый пакет Microsoft Visual C ++ 2008 SP1 (x86)

Каждая версия MSCV (включая уровень SP) имеет свой собственный пакет для переадресации. Убедитесь, что вы выбрали правильный вариант для своего компилятора.

После того, как вы потушите огонь, сядьте со своим боссом и убедите его, что если вы собираетесь притворяться софтверной компанией, вы должны вести себя как один. Получите реальную производственную среду. Это не клуб программирования для средней школы, это ваша жизнь.

РЕДАКТИРОВАТЬ: Просто чтобы быть ясно. Как только вы получите переадресацию, не распаковывайте ее на свой компьютер, а затем включите закодированные библиотеки DLL в вашу настройку. Вместо этого, включите весь установщик Redist в качестве подэтапа вашей установки. Сначала установите Redist, а затем установите свой код.

13
задан flesh 1 June 2009 в 22:59
поделиться

2 ответа

Отражение работает только на одном уровне за раз.

Вы пытаетесь проиндексировать свойство, это неверно.

Вместо этого прочитайте значение свойства, а возвращаемый объект, это объект, который нужно индексировать.

Вот пример:

using System;
using System.Collections.Generic;
using System.Reflection;

namespace DemoApp
{
    public class TestClass
    {
        public List<Int32> Values { get; private set; }

        public TestClass()
        {
            Values = new List<Int32>();
            Values.Add(10);
        }
    }

    class Program
    {
        static void Main()
        {
            TestClass tc = new TestClass();

            PropertyInfo pi1 = tc.GetType().GetProperty("Values");
            Object collection = pi1.GetValue(tc, null);

            // note that there's no checking here that the object really
            // is a collection and thus really has the attribute
            String indexerName = ((DefaultMemberAttribute)collection.GetType()
                .GetCustomAttributes(typeof(DefaultMemberAttribute),
                 true)[0]).MemberName;
            PropertyInfo pi2 = collection.GetType().GetProperty(indexerName);
            Object value = pi2.GetValue(collection, new Object[] { 0 });

            Console.Out.WriteLine("tc.Values[0]: " + value);
            Console.In.ReadLine();
        }
    }
}
19
ответ дан 1 December 2019 в 22:40
поделиться

Я был там большую часть пути, пока не увидел это, и я публикую это, потому что нигде больше не видел; ключ использовал GetValue (collection, new Object [] {i}); в цикле, а не пытаться использовать GetValue (collection, new Object [i]); вне цикла. (Вы, вероятно, можете проигнорировать «вывод» в моем примере);

private static string Recursive(object o)
{ 
        string output="";
        Type t = o.GetType();
        if (t.GetProperty("Item") != null)
        {
            System.Reflection.PropertyInfo p = t.GetProperty("Item");
            int count = -1;
            if (t.GetProperty("Count") != null && 
                t.GetProperty("Count").PropertyType == typeof(System.Int32))
            {
                count = (int)t.GetProperty("Count").GetValue(o, null);
            }
            if (count > 0)
            {
                object[] index = new object[count];
                for (int i = 0; i < count; i++)
                {
                    object val = p.GetValue(o, new object[] { i });
                    output += RecursiveWorker(val, p, t);
                }
            }
       }
       return output;        
}
2
ответ дан 1 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: