#pragma once

namespace FDK
{
	generic<typename TKey, typename TValue>
	public ref class CSerializableDictionary : Dictionary<TKey, TValue>, IXmlSerializable
	{
	public:
		ref class KeyValue
		{
		public:
			TKey Key;
			TValue Value;
			KeyValue() 
			{
				this->Disposed = gcnew CDisposed();
			}
			KeyValue( TKey key, TValue value )
			{
				this->Disposed = gcnew CDisposed();

				Key = key;
				Value = value;
			}
			~KeyValue()
			{
				if( this->Disposed->bDispose済みまたは処理中である )
					return;		// 例外を発出させない。

				if( !this->Disposed->t開始を宣言する() )
					return;		// 例外を発出させない。


				//GC::SuppressFinalize( this );   --> コンパイラが勝手にやる
			}

		private:
			CDisposed^ Disposed;
		};

		CSerializableDictionary()
		{
			this->Disposed = gcnew CDisposed();
		}
		~CSerializableDictionary()
		{
			if( this->Disposed->bDispose済みまたは処理中である )
				return;		// 例外を発出させない。

			if( !this->Disposed->t開始を宣言する() )
				return;		// 例外を発出させない。

		}

		#pragma region [ IXmlSerializable の実装 ]
		//-----------------
		virtual XmlSchema^ GetSchema();
		virtual void ReadXml( XmlReader^ reader );
		virtual void WriteXml( XmlWriter^ writer );
		//-----------------
		#pragma endregion

	private:
		CDisposed^ Disposed;
	};
}