У меня есть массив объектов другого типа, и я использую BinaryWriter для преобразования каждого элемента в его двоичный эквивалент, чтобы я мог отправить структуру по сети.Есть ли способ вернуть объект обратно к нему исходного типа без указания каждого случая?
я в настоящее время сделать что-то вроде
for (i=0;i<tmpArrayList.Count;i++)
{
object x=tmpArrayList[i];
if (x.GetType() == typeof(byte))
{
wrt.Write((byte)x);
}
........
Проблема в том, что если пропустить тип их мой код может сломаться в будущем.
Я хотел был бы сделать что-то вроде.
object x=tmpArrayList[i];
wrt.Write(x);
но это не сработает, если я не делаю каждого броска.
Edit:
После консультаций ответов это то, что я придумал для этой функции. Для тестирования эта функция отправляет массив в syslog.
private void TxMsg(ArrayList TxArray,IPAddress ipaddress)
{
Byte[] txbuf=new Byte[0];
int sz=0;
// caculate size of txbuf
foreach (Object o in TxArray)
{
if (o is String)
{
sz+=((String)(o)).Length;
}
else if (o is Byte[])
{
sz+=((Byte[])(o)).Length;
}
else if (o is Char[])
{
sz+=((Char[])(o)).Length;
}
else // take care of non arrays
{
sz+=Marshal.SizeOf(o);
}
}
txbuf = new Byte[sz];
System.IO.MemoryStream stm_w = new System.IO.MemoryStream(txbuf, 0,txbuf.Length);
System.IO.BinaryWriter wrt = new System.IO.BinaryWriter(stm_w);
foreach (Object o in TxArray)
{
bool otypefound=false;
if (o is String) // strings need to be sent one byte per char
{
otypefound=true;
String st=(String)o;
for(int i=0;i<st.Length;i++)
{
wrt.Write((byte)st[i]);
}
}
else
{
foreach (MethodInfo mi in typeof(BinaryWriter).GetMethods())
{
if (mi.Name == "Write")
{
ParameterInfo[] pi = mi.GetParameters();
if ((pi.Length == 1)&&(pi[0].ParameterType==o.GetType()))
{
otypefound=true;
mi.Invoke(wrt, new Object[] { o });
}
}
}
}
if(otypefound==false)
{
throw new InvalidOperationException("Cannot write data of type " + o.GetType().FullName);
}
}
IPEndPoint endpoint = new IPEndPoint(ipaddress, 514); //syslog port
UdpClient udpClient_txmsg = new UdpClient();
udpClient_txmsg.Send(txbuf, txbuf.Length,endpoint); // send udp packet to syslog
}
+1 за «смотреть вниз документы для BinaryWriter "... обратите внимание на наличие перегрузок для массивов - Write (char []) и Write (byte []) – Jimmy 2008-12-11 17:45:09
Почему лучше использовать GetType() для сравнения типов? – sthay 2008-12-21 04:23:25
Это быстрее, код проще, и он недействителен. – 2008-12-21 07:59:48