1

リフレクションコールを介して最終的に作成されたオブジェクトがあります。

object readOnlyCollectionObject = propertyInfo.GetValue(someEntity, null);

私はこのオブジェクトが一般的なReadOnlycollectionであることを知っています。ReadOnlyCollection<Cat>、などの可能性がありReadOnlyCollection<Dog>ます。議論のために、それがであるとだけ言いましょうReadOnlyCollection<T>

Dogはオブジェクトから派生していますが、aReadOnlyCollection<Dog>はから派生していないことを私は知っていReadOnlyCollection<object>ます。したがって、リフレクションを使用してCopyToメソッドを呼び出したとしても、特定のタイプのReadOnlyCollectionを知る必要があります。これは、避けたいことです。

の特定のタイプ(T)を知らなくても、オブジェクト参照の配列としてReadOnlyCollectionからすべての要素を取得する方法を知りたいですReadOnlyCollection<T>

4

5 に答える 5

4

他の多くの回答はCast()とToArrayに言及していますが、それらはすべて型に問題があります。あなたが言うように、あなたはあなたのプロパティがどの特殊なIEnumerableを実装するかわかりません。ただし、それらがすべて非ジェネリックICollectionインターフェイスを実装することを確認できます。

ICollection readOnlyCollectionObject = (ICollection)propertyInfo.GetValue(someEntity, null);
object[] objs = new ArrayList(readOnlyCollectionObject).ToArray();

また

ICollection readOnlyCollectionObject = (ICollection)propertyInfo.GetValue(someEntity, null);
object[] objs = new object[readOnlyCollectionObject.Count];
for (int i = 0; i < readOnlyCollectionObject.Count; i++)
    objs[i] = readOnlyCollectionObject[i];

編集:キャストをIEnumerableからICollectionに更新するのを忘れました

于 2009-03-10T11:47:02.640 に答える
3

読み取り専用コレクションでCast拡張メソッドを使用して、それをオブジェクトの配列に変換できますが、c#配列は共変であるという事実に基づいて、次のようにすることができます。

object[] objs = myReadOnlyCollection.ToArray();

(編集)

Pop Catalinが述べたように、Tが参照型である場合にのみ機能します。それ以外の場合は、Castメソッドを使用します。

(編集2)

質問に対するあなたの更新は物事をかなり変えます...私はあなたがしようとしていることは不可能だと思います。実行時にのみ使用可能な、コンパイル時に明示的な型にキャストする必要があります。この場合、コレクションにアクセスする必要がある唯一の方法は、リフレクションを使用することです。

于 2009-03-10T09:47:37.950 に答える
1
 var myArray = readOnlyCollection.Cast<object>().ToArray(); 
于 2009-03-10T09:48:05.517 に答える
0

コレクションをオブジェクトのリストにキャストしてから、ToArray()を呼び出します。

ReadOnlyCollection<string> s;
object[] o = s.Cast<object>().ToArray();

拡張メソッドがあるため、C#3.5でのみ機能します。

于 2009-03-10T09:49:23.203 に答える
-1

コレクションのディープクローンが必要ですか?ディープクローンを作成する場合は、メモリディープクローンを作成するために以下のコードを試してください。

// deep copy in separeate memory space
public object Clone()
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, this);
    ms.Position = 0;
    object obj = bf.Deserialize(ms);
    ms.Close();
    return obj;
}
于 2009-03-10T09:48:20.117 に答える