型が不定のクラスインスタンスを共通クラスに持つ方法がわかりません
各API用のデータクラスが複数あり、
各クラスのデータをAPI送受信のManagerクラスに渡したいのですが、
どのようにすれば良いのかがわかりません。
下記のように仮のデータクラスとしてTestAとTestBを作り、
APIManager内にどちらのインスタンスが来てもセットできる変数を作成したいです。
●testAクラス
using UnityEngine;
using System.Collections;
public class TestA{
int val1;
int val2;
int val3;
}
●testBクラス
using UnityEngine;
using System.Collections;
public class TestB {
int val1;
long val2;
string valstr;
}
●ApiManagerクラス(シングルトン)
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
public sealed class ApiManager
{
-----------------追記-----------------
private APICommunicationThread ThreadOne = new APICommunicationThread();
// ●●●●●●●●●●ここに不定なクラスのインスタンスを持ちたいです。
private static ApiManager m_Instance = new ApiManager();
-----------------追記-----------------
/// <summary>
/// スリープFLGを解除してスレッド再起動
/// </summary>
public void OnClickGoMessagePack()
{
ThreadOne.SleepFlgFalse();
}
private ApiManager()
{
// Console.WriteLine("Created instance.");
}
public static ApiManager Instance
{
get
{
return m_Instance;
}
}
public void DoSomething()
{
// Console.WriteLine("DoSomething is called");
}
}
-----------------追記-----------------
●最終的な処理の流れ
①各機能でデータ(TestAやTestBなどAPIにより異なる)を作成してもらい、
ApiManagerの型不定のインスタンスにデータをセット、
APIのURL、コールバック先のメソッドもセットしてもらい
ApiManagerの通信スタート(スレッド再開)を呼ぶ。
②ApiManagerでは通信用クラスに型不定のインスタンス、APIのURL、コールバック先を渡し
通信用クラスのスレッドを再開させる。
③通信用クラス内では型不定のインスタンスの型でシリアライザーを作成し、
シリアライザーのPackメソッドで型不定インスタンスをストリームにパックする
④指定URLにPackデータを送信
⑤レスポンス取得後、中身のデータをコールバック先に渡す。
using System.Collections;
using System.Collections.Generic;
using MsgPack;
using MsgPack.Serialization;
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Collections.ObjectModel;
using System.Threading;
public class APICommunicationThread
{
private string MsgLog;
public string SendUrl;
public 不定な型 SendDataObj;
public Type SendType;
public Action<Object> CallBackTo;
public Thread _threadFirst;
public AutoResetEvent _threadEvent;
public string TestString;
public bool SleepFLG = false;
public bool GoSendFLG = false;
public void ThreadStart()
{
SleepFLG = true;
GoSendFLG = false;
_threadFirst = new Thread(ThreadWorking);
_threadEvent = new AutoResetEvent(true);
_threadFirst.Start();
}
/// <summary>
/// スレッド処理
/// </summary>
public void ThreadWorking()
{
while (true)
{
// 現在、MessagePack処理をおこなっているか?
if(GoSendFLG == true)
{
SleepFLG = false;
GoSendFLG = false;
// MessagePack処理
MessagePackSend();
}
else
{
/// スレッド休止用FLGが立っているか?
if (SleepFLG == true)
{
TestString = "Sleep On";
// スレッドを給仕状態にする
_threadEvent.WaitOne();
}
else
{
TestString = "Sleep Off";
}
}
}
}
/// <summary>
/// Msgpackを使用してAPI通信
/// </summary>
public void MessagePackSend()
{
try
{
MsgLog = "BEF SERIALIZE";
var stream = new MemoryStream();
// --- シリアライズ
// Set using Map instead of Array to serialize complex object. See Sample03 for details.
var context = new SerializationContext();
context.SerializationMethod = SerializationMethod.Map;
MsgLog = MsgLog + "BEF SERIALIZE2";
// 1. Create serializer instance.
var serializer = MessagePackSerializer.Get<不定な型>(context);
MsgLog = MsgLog + "AFT SERIALIZE";
// 2. Serialize object to the specified stream.
serializer.Pack(stream,不定な型のインスタンス);
MsgLog = MsgLog + "AFT PACK";
byte[] bytes = stream.GetBuffer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(SendUrl);
req.ContentType = "application/x-msgpack; charset=UTF-8";
req.Method = "POST";
req.Accept = "application/x-msgpack";
req.ContentLength = bytes.Length;
MsgLog = MsgLog + "BEF GETREQ";
// データの設定
var s = req.GetRequestStream();
s.Write(bytes, 0, bytes.Length);
s.Close();
// ***End your original code***
MsgLog = MsgLog + "SENT";
using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse())
{
using (Stream st = wres.GetResponseStream())
{
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[4096];
int count = 0;
do
{
count = st.Read(buffer, 0, buffer.Length);
memoryStream.Write(buffer, 0, count);
} while (count != 0);
var deserializer = MessagePackSerializer.Get<不定な型>();
// デバッグ用UTF-8 エンコード
string unpacktext = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
var unpacked = deserializer.UnpackSingleObject(memoryStream.ToArray());
CallBackTo(unpacked);
}
}
}
}
catch (Exception ex)
{
MsgLog = ex.Message;
}
/// 処理が終了したのでスレッド休止用FLGをたてる
SleepFLG = true;
}
/// <summary>
/// スレッドを休止状態から起こす
/// </summary>
public void SleepFlgFalse()
{
/* スレッド処理を実行するようにフラグを落とします */
SleepFLG = false;
GoSendFLG = true;
/* AutoResetEventオブジェクトをシグナル状態にして
スレッドを再開させます */
_threadEvent.Set();
}
public string DisplayLog()
{
return MsgLog;
}
}