0

私は次の方法を持っています:

object GetIndexer()

メソッドの結果は、次の型のインデクサーです。

SomeCollection<T>

各 T が型 Y を拡張することを知っているので、T は何でもかまいません。

キャストしてみた

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

リストをループすることは、列挙のプロセスです。列挙子を使用するのが最も簡単です。つまり(C#では):を実装するものなら何でもIEnumberable

ループしようとしているオブジェクトが自分で作成したものである場合は、IEnumberableを実装することをお勧めします。そうでない場合は、この特定のサードパーティオブジェクトに関する詳細情報を提供できますか?たぶん、このようにそれを使う必要がある他の人たちがいて、たぶん彼らの仕事は私たちの一人がオンラインで見つけることができます。

于 2009-10-21T19:54:44.640 に答える
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 に答える