У меня есть класс, NetworkClient в качестве базового класса:C#: Преобразование базового класса для ребенка Класс
using System.IO;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace Network
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class NetworkClient
{
public NetworkClient()
{
tcpClient = new TcpClient();
}
public NetworkClient(TcpClient client)
{
tcpClient = client;
}
public virtual bool IsConnected
{
get;
private set;
}
private StreamWriter writer { get; set; }
private StreamReader reader { get; set; }
private TcpClient tcpClient
{
get;
set;
}
public virtual NetworkServerInfo NetworkServerInfo
{
get;
set;
}
public async virtual void Connect(NetworkServerInfo info)
{
if (tcpClient == null)
{
tcpClient=new TcpClient();
}
await tcpClient.ConnectAsync(info.Address,info.Port);
reader = new StreamReader(tcpClient.GetStream());
writer = new StreamWriter(tcpClient.GetStream());
}
public virtual void Disconnect()
{
tcpClient.Close();
reader.Dispose();
writer.Dispose();
}
public async virtual void Send(string data)
{
await writer.WriteLineAsync(data);
}
public async virtual Task<string> Receive()
{
return await reader.ReadLineAsync();
}
}
}
А также есть дочерний класс, производный от NetworkClient:
using System.Net;
namespace Network
{
using Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class SkyfilterClient : NetworkClient
{
public virtual IPAddress Address
{
get;
set;
}
public virtual int Port
{
get;
set;
}
public virtual string SessionID
{
get;
set;
}
public virtual User UserData
{
get;
set;
}
protected virtual bool Authenticate(string username, string password)
{
throw new System.NotImplementedException();
}
}
}
Проблема заключается в том, что когда я пытаюсь передать NetworkClient в SkyfilterClient. Исправлено исключение. Невозможно передать объект типа «Network.NetworkClient» для ввода «Network.SkyfilterClient».
Что не так с моим кодом? Я вижу, что Stream можно преобразовать в NetworkStream, MemoryStream. Почему NetworkClient не может быть конвертирован в Skyfilter Client?
Здравствуйте, я попробовал ваш пример с некоторыми изменениями. И он преобразовал родительский объект в дочерний, но он не перенесет какое-либо родительское свойство на дочерний объект. Для моего кода я ожидал метод, который бы преобразовал родительский объект в дочерний, а также перенести родительские свойства (дочерние свойства будут пустыми). Есть идеи ? –
@ GemantTank Лучше всего задать вопрос в отдельном вопросе честно. Я не поддерживал некоторые из этих старых вопросов. –
Спасибо. На данный момент я использую метод Box/unbox на основе JSON. Не идеально, но отлично работает для моей цели - https://stackoverflow.com/questions/8329470/convert-derived-class-to-base-class –