Определение пользовательского индексатора с использованием отражения в C # - PullRequest
27 голосов
/ 28 августа 2009

У меня есть класс с пользовательским индексатором, таким образом

public string this[VehicleProperty property]
{
  // Code
}

Как я могу идентифицировать пользовательский индексатор по результатам typeof (MyClass) .GetProperties ()?

Ответы [ 5 ]

39 голосов
/ 28 августа 2009

Вы также можете искать параметры индекса, используя метод PropertyInfo.GetIndexParameters , если он возвращает более 0 элементов, это индексированное свойство:

foreach (PropertyInfo pi in typeof(MyClass).GetProperties())
{
    if (pi.GetIndexParameters().Length > 0)
    {
       // Indexed property...
    }
}
5 голосов
/ 28 августа 2009

Ищите DefaultMemberAttribute, определенный на уровне типа.

(Раньше это было IndexerNameAttribute, но, похоже, они его сбросили)

3 голосов
/ 28 августа 2009
    static void Main(string[] args) {

        foreach (System.Reflection.PropertyInfo propertyInfo in typeof(System.Collections.ArrayList).GetProperties()) {

            System.Reflection.ParameterInfo[] parameterInfos = propertyInfo.GetIndexParameters();
            // then is indexer property
            if (parameterInfos.Length > 0) {
                System.Console.WriteLine(propertyInfo.Name);
            }
        }


        System.Console.ReadKey();
    }
0 голосов
/ 01 апреля 2019

Если есть только один индексатор, вы можете использовать это:

var indexer = typeof(MyClass).GetProperties().First(x => x.GetIndexParameters().Length > 0));

Если имеется несколько индексаторов, вы можете выбрать нужную перегрузку, указав следующие аргументы:

var args = new[] { typeof(int) };
var indexer = typeof(MyClass).GetProperties().First(x => x.GetIndexParameters().Select(y => y.ParameterType).SequenceEqual(args));

Вы можете создать вспомогательное расширение следующим образом:

//Usage      
var indexer = typeof(MyClass).GetIndexer(typeof(VehicleProperty));
//Class
public static class TypeExtensions
{
  public static PropertyInfo GetIndexer(this Type type, params Type[] arguments) => type.GetProperties().First(x => x.GetIndexParameters().Select(y => y.ParameterType).SequenceEqual(arguments));
}
0 голосов
/ 18 июня 2018

Для получения известного индексатора вы можете использовать:

var prop = typeof(MyClass).GetProperty("Item", new object[]{typeof(VehicleProperty)});
var value = prop.GetValue(classInstance, new object[]{ theVehicle });

или вы можете получить метод получения индексатора:

var getterMethod = typeof(MyClass).GetMethod("get_Item", new object[]{typeof(VehicleProperty)});
var value = getterMethod.Invoke(classInstance, new object[]{ theVehicle });

если в классе есть только один индексатор, вы можете опустить тип:

var prop = typeof(MyClass).GetProperty("Item", , BindingFlags.Public | BindingFlags.Instance);

Я добавил этот ответ для тех, кто привел их в поиск Google.

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