0

我有以下方法:

object GetIndexer()

该方法的结果是以下类型的索引器:

SomeCollection<T>

现在 T 可以是任何东西,因为我知道每个 T 都扩展了类型 Y。

我试过铸造

SomeCollection<Y> result= (SomeCollection<Y>) GetIndexer()

它没有用。

我需要知道的是如何使用反射访问索引器 SomeCollection 中每个项目的属性?

4

4 回答 4

2

用于GetType()每个项目,然后调用GetProperties()GetProperty(propertyName)以获取 PropertyInfo。有了这个,你然后调用GetValue()传递你的对象。

一个例子:

    List<object> objects = new List<object>();
    // Fill the list
    foreach (object obj in objects)
    {
        Type t = obj.GetType();
        PropertyInfo property = t.GetProperty("Foo");
        property.SetValue(obj, "FooFoo", null);
        Console.WriteLine(property.GetValue(obj, null));            
    }
于 2009-10-21T19:42:50.123 回答
0

一些上下文会有所帮助,但听起来你有类似的东西

class Foo<T> where T : Y {
    object GetIndexer() { /* ... */ }
}

在那种情况下,为什么不只是

    SomeCollection<Y> GetIndexer() { /* */ }

这样,就不需要演员表了。

但是我对您对“索引器”一词的使用感到有些困惑。C# 的索引器是一种为类型重载 [] 运算符的方法,因此您可以执行以下操作:

MyCollectionType c = new MyCollectionType()
c["someValue"]

它们的定义如下:

class MyCollectionType {
    public string this [string index] // This particular indexer maps strings to strings, but we could use other types if we wished.
    get {} // Defines what to do when people do myCollection["foo"]
    set {} // Defines what to do when people do myCollection["foo"] = "bar"
}

类型的对象SomeCollection<Y>不是索引器,它是一个集合。

于 2009-10-21T19:45:56.580 回答
0

是可数的SomeCollection<T>吗?如果是这样,你可以这样做

 var transformed = new SomeCollection<Y>();

 var someObjectCollection = (IEnumberable)GetIndexer();
 foreach (var someObjectin someObjectCollection);
     transformed.Add((Y)someObject);

或者等到 C# 4.0 为我们提供更多的协变和逆变选项。

于 2009-10-21T19:49:31.130 回答
0

遍历列表是枚举的过程。使用枚举器最简单。那是(在 C# 中):任何实现IEnumberable.

如果您尝试循环的对象是您自己制作的对象之一,我建议您实现 IEnumberable。如果不是,您能否提供有关此特定第 3 方对象的更多信息?也许还有其他人也需要以这种方式使用它,也许我们中的一个人可以在网上找到他们的工作。

于 2009-10-21T19:54:44.640 回答