反射-如何在参数的指定索引处获得值



我正在尝试使用反射获得属性的指定索引的值。

这个答案适用于类型为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("找到模棱两可的匹配")。我知道我的收集类有点做作,但有人能帮我吗?

一个选择是使用

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

如果需要,将Collection.GetType()更改为其他类型。但基本上:循环遍历属性,而不是使用Type.GetProperty

如果您正在查找所有默认成员,您可以请求Type.GetDefaultMembers(),然后检查成员以查找您正在查找的成员。

或者,如果您知道索引器的数据类型,可以使用类型数组说明符调用GetPropertyInfo。

相关内容

  • 没有找到相关文章

最新更新