Отражение - как получить значение по указанному индексу параметра - PullRequest
2 голосов
/ 09 декабря 2011

Я пытаюсь получить значение указанного индекса свойства, используя отражение.

Этот ответ работает, например, для стандартных свойств типа List <>, но в моем случае коллекция, с которой я пытаюсь работать, имеет другой формат:

public class NumberCollection : List<int>
{
    public NumberCollection()
    {
        nums = new List<int>();
        nums.Add(10);
    }

    public new int this[int i]
    {
        get { return (int) nums[i]; }
    }

    private List<int> nums;

}

public class TestClass
{
    public NumberCollection Values { get; private set; }

    public TestClass()
    {
        Values = new NumberCollection();
        Values.Add(23);
    }
}


class Program
{
    static void Main(string[] args)
    {
        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;
        // Code will ERROR on the next line...
        PropertyInfo pi2 = collection.GetType().GetProperty(indexerName);
        Object value = pi2.GetValue(collection, new Object[] { 0 });

        Console.Out.WriteLine("tc.Values[0]: " + value);
        Console.In.ReadLine();
    }
}

Этот код дает исключение AmbiguousMatchException ("Обнаружено неоднозначное соответствие."). Я знаю, что мой класс коллекции немного надуманный, но может ли кто-нибудь помочь с этим?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Один из вариантов - использовать

var prop = Type.GetProperties()
               .Where(prop => prop.DeclaringType == collection.GetType())
               .First();

Измените Collection.GetType() на другой тип, если хотите.Но в основном: перебирайте свойства вместо использования Type.GetProperty.

0 голосов
/ 09 декабря 2011

Если вы ищете всех участников по умолчанию, вы можете запросить Type.GetDefaultMembers () , затем проверьте участников, чтобы найти того, кого вы ищете.

В качестве альтернативы, если вы знаете тип данных индексатора, вы можете вызвать GetPropertyInfo с указателем массива типов.

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