0

元のソースを変更してもキャッシュ内のオブジェクトが変更されないように、複製されたオブジェクトのリストをキャッシュに追加しようとしています。ただし、必要なタイプとしてそれらをキャッシュに追加することはできません。

List<ComputerStatus> clonedCopy = listOfComputers.Select(s => s.Clone()).ToList();というエラーが表示されます"Cannot implicitly convert type 'System.Collections.Generic.List<object>' to 'System.Collections.Generic.List<MvcWebAPI.Models.ComputerStatus>'"

それをキャッシュに追加するだけなら

var clonedCopy = listOfComputers.Select(s => s.Clone());
CacheManager.AddToCache("myKey", clonedCopy, CacheItemPriority.Default, 30);

そして、それを次のように取得しようとします

List<ComputerStatus> listOfComputers = new List<ComputerStatus>();
listOfComputers = CacheManager.GetFromCache("myKey") as List<ComputerStatus>; 

その後、null を返します

これは私の ComputerStatus クラスがどのように見えるかです:

public class ComputerStatus : ICloneable
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}
4

1 に答える 1

1

やってみました

List<ComputerStatus> clonedCopy = listOfComputers.Select(s => (ComputerStatus)s.Clone()).ToList();

あなたの問題は、Clonefromのデフォルトの実装がIClonableタイプのオブジェクトを返すobjectため、選択のタイプがIEnumerable<object>ToList に変わるためList<object>です。clone の結果を a としてキャストすることによりComputerStatus、select を に変更し、 にIEnumerable<ComputerStatus>変換ToList()List<ComputerStatus>ます。

IEnumerable<object>キャストできない を保存しているList<ComputerStatus>ためnull、安全なキャストを使用しているため、2回目の試行は失敗します。ToList()さらに、実際に読み取りに来るまで列挙型が延期され、コレクションへの変更が影響するか、コレクション変更例外が発生する可能性があるため、なしで慎重に保存する必要があります。

于 2013-06-07T15:24:26.993 に答える