我有以下方法:
object GetIndexer()
该方法的结果是以下类型的索引器:
SomeCollection<T>
现在 T 可以是任何东西,因为我知道每个 T 都扩展了类型 Y。
我试过铸造
SomeCollection<Y> result= (SomeCollection<Y>) GetIndexer()
它没有用。
我需要知道的是如何使用反射访问索引器 SomeCollection 中每个项目的属性?
我有以下方法:
object GetIndexer()
该方法的结果是以下类型的索引器:
SomeCollection<T>
现在 T 可以是任何东西,因为我知道每个 T 都扩展了类型 Y。
我试过铸造
SomeCollection<Y> result= (SomeCollection<Y>) GetIndexer()
它没有用。
我需要知道的是如何使用反射访问索引器 SomeCollection 中每个项目的属性?
用于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));
}
一些上下文会有所帮助,但听起来你有类似的东西
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>
不是索引器,它是一个集合。
是可数的SomeCollection<T>
吗?如果是这样,你可以这样做
var transformed = new SomeCollection<Y>();
var someObjectCollection = (IEnumberable)GetIndexer();
foreach (var someObjectin someObjectCollection);
transformed.Add((Y)someObject);
或者等到 C# 4.0 为我们提供更多的协变和逆变选项。
遍历列表是枚举的过程。使用枚举器最简单。那是(在 C# 中):任何实现IEnumberable
.
如果您尝试循环的对象是您自己制作的对象之一,我建议您实现 IEnumberable。如果不是,您能否提供有关此特定第 3 方对象的更多信息?也许还有其他人也需要以这种方式使用它,也许我们中的一个人可以在网上找到他们的工作。