使用C#中的反射识别自定义索引器

时间:2009-08-28 15:59:01

标签: c# .net

我有一个类似自定义索引器的类

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

如何在typeof(MyClass).GetProperties()的结果中识别自定义索引器?

5 个答案:

答案 0 :(得分:39)

您还可以使用PropertyInfo.GetIndexParameters方法查找索引参数,如果它返回的项目超过0,则它是索引属性:

foreach (PropertyInfo pi in typeof(MyClass).GetProperties())
{
    if (pi.GetIndexParameters().Length > 0)
    {
       // Indexed property...
    }
}

答案 1 :(得分:5)

查找在类型级别定义的DefaultMemberAttribute

(以前是IndexerNameAttribute,但他们似乎放弃了它)

答案 2 :(得分:3)

    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();
    }

答案 3 :(得分:0)

要获得已知的索引器,您可以使用:

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

或者你可以获得索引器的getter方法:

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);

我已经为谷歌搜索引导他们的人添加了这个答案。

答案 4 :(得分:0)

如果只有一个索引器,则可以使用此:

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));
}