update
After a bit of a chat with Kikaimaru, I realized the deep copy wont work as seamlessly as I thought. Too bad, I thought it was very elegant. The methods below will still work though.
If you are still set on doing it, try something like this. Just overload the method telling it to cache or not. I pretty much snagged this from this blogfrom this blog, and he goes into more detail there. You might find it useful should you decide to go this way.
public override T Load<T>(string assetName)
{
return Load<T>(assetName, true);
}
public T Load<T>(strng assetName, bool cache)
{
if (loadedAssets.ContainsKey(assetName))
return (T)loadedAssets[assetName];
T asset = ReadAsset<T>(assetName, null);
if(cache)
loadedAssets.Add(assetName, asset);
return asset;
}
I had another thought. What you could do it something along the lines of creating an interface to make all your non-cacheable object implement. Have the load manager look for that, and don't cache if it is found. You could accomplish the same thing with an attribute if you wanted.
public interface INoCache{} //no member here, just empty...Maybe a bool "ShouldCache" if you want...
public class Destructible : INoCache
//In your ContentManager
public T Load<T>(string assetName)
{
if (loadedAssets.ContainsKey(assetName))
return (T)loadedAssets[assetName];
T asset = ReadAsset<T>(assetName, null);
//this logic seems a bit backwards, but
//it makes for a little cleaner code IMHO
if(!(asset is INoCache))
loadedAssets.Add(assetName, asset);
return asset;
}