我有一个带有自定义索引器的类,如下所示
public string this[VehicleProperty property]
{
// Code
}
如何在 typeof(MyClass).GetProperties() 的结果中识别自定义索引器?
您还可以使用PropertyInfo.GetIndexParameters方法来查找索引参数,如果返回的项数大于0,则表示它是一个索引属性:
foreach (PropertyInfo pi in typeof(MyClass).GetProperties())
{
if (pi.GetIndexParameters().Length > 0)
{
// Indexed property...
}
}
查找在类型级别定义的DefaultMemberAttribute
。
(这曾经是IndexerNameAttribute
,但他们似乎已经放弃了它)
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();
}
要获取已知的索引器,您可以使用以下代码:
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);
我为那些通过谷歌搜索来到这里的人添加了这个答案。
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));
}
DefaultMemberAttribute
不一定引用索引器,请参见此答案。 - HermanDefaultMemberAttribute
将会引用它,以至于你不能将DefaultMemberAttribute
应用于一个带有索引器的类。 - Zev SpitzItem
,编译器生成的DefaultMemberAttribute将指向Item
,而不指定哪个重载。 - Zev Spitz