![]() |
Typecasting in C#
Hi,
In Delphi geht ja folgendes:
Delphi-Quellcode:
Das geht in C# nicht. Ich habe meine SocketEx-Klasse von Socket abgeleitet und mein Problem ist gerade, dass Socket.Accept() ein Socket zurück gibt und er mir das weder implizit noch explizit konvertieren will.
var x: TObject;
y: TButton; begin x := y; end;
Code:
Das compiliert zwar, wirft aber eine Exception. Weiß jemand wies geht?
SocketEx tmp;
tmp = (SocketEx)server.Accept(); |
Re: Typecasting in C#
Zitat:
Zitat:
In Delphi kannst du alles auf alles casten, weil Delphi zur Laufzeit nicht Typsafe ist. .Net IST typesafe. Du kannst nicht eine Referenz von Socket als SocketEx nutzen, wenn die Referenz nicht auf eine Instanz von SocketEx oder einen Nachfahren zeigt. das hier würde gehen:
Code:
Socket ref1 = new SocketEx();
SocketEx ref2 = (SocketEx)ref1; |
Re: Typecasting in C#
Hi,
Also so sieht meine (noch sehr bescheidene^^) SocketEx Klasse aus:
Code:
Die Methode Accept() von Socket gibt ein Socket zurück. Quasi:
public class SocketEx:Socket
{ public bool isbusy; SocketEx(AddressFamily addr, SocketType socktype,ProtocolType protoc):base(addr,socktype,protoc) { } }
Code:
und folgendes geht nicht:
public Socket Accept()
{ // ka }
Code:
Meldung:
public static SocketEx server = new SocketEx(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// ... SocketEx tmp; tmp = server.Accept(); Zitat:
|
Re: Typecasting in C#
Hallo,
sowas kann ja nicht gehen. Du hast eine Variable vom Typ einer abgeleiteten Klasse, und willst ihr ein Objekt der Basisklasse zuweisen. Andersrum wird ein Schuh draus. Sowas klappt auch in Delphi nicht. Gruß xaromz |
Re: Typecasting in C#
Ehm Recht hast du.
Aber wie löse ich denn jetzt mein Problem konkret? Das muss doch gehn?! Ich steh grad aufm Schlauch :? |
Re: Typecasting in C#
Zitat:
Code:
SocketEx server = new SocketEx(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket tmp = server.Accept(); |
Re: Typecasting in C#
Zitat:
Das Problem ist einfach, dass das Socket was ich von Accept() zurückbekomme eben nur ein Socket ist und kein SocketEx -.- Also kann ich da noch so viel rumcasten. Wenns kein SocketEx ist, ists kein SocketEx... :| Toll -.- Jetzt bin ich mit meinem (C#-)Latein am Ende :( |
Re: Typecasting in C#
Denkt doch nicht so kompliziert! So einfach geht es:
Code:
Begründung: Accept liefert eine Socket-Instanz. Wenn es sich dabei aufgrund der äußeren Umstände wirklich um eine SocketEx-Instanz handelt, kann es mit as einfach konvertiert werden. Dies hat außerdem den Vorteil, dass die as-Konvertierung im Fehlerfall null zurückliefert, ohne dass es zu einer Exception führt. Dies kann (besser: sollte in der Regel) vor der Fortsetzung geprüft werden.
SocketEx ext = server.Accept() as SocketEx;
if (ext != null) // usw. Das besagte auch die obige Fehlermeldung: Zitat:
Gruß Jürgen |
Re: Typecasting in C#
Beschreibe doch einmal näher, was du mit deiner SocketEx-Klasse vorhast. Wenn es ein Wrapper werden soll, ist Vererbung der falsche Weg.
|
Re: Typecasting in C#
Zitat:
Zitat:
|
Re: Typecasting in C#
Zitat:
Grundidee:
Code:
Das heisst Du hast zwei Extension Methods (getter und setter) und speicherst die Daten in einem Object-Value dictionary. Das Objekt selber nimmst Du als Schlüssel her. Somit geht das nicht nur auf dem Socket, sondern auf jedem beliebigen anderen Objekt auch.
public static class ValueHolder
{ private static Dictionary<Object, String> _Values = new Dictionary<Object, String>(); public static void SetValue(this Object obj, String value) { _Values.Add(obj, value); } public static String GetValue(this Object obj) { return _Values[obj]; } } |
Re: Typecasting in C#
Hi,
Naja danke für den Code und den Ansatz, aber ich will in meinem Programm nicht zu rummurksen :mrgreen: Der Code muss schon ordentlich werden. Ich muss mal gucken.... |
Re: Typecasting in C#
Zitat:
Es gibt eben Dinge, die gehen ned anders. Es gibt eben leider kein ISocket Interface. Damit liesse sich sowas mittels Interface Delegation und Prism in ein paar Zeilen sehr elegant lösen. Aber Extension Methods sind durchaus legitim. |
Re: Typecasting in C#
Zitat:
|
Re: Typecasting in C#
Gibts in C# keine Class Helper? :gruebel: :mrgreen:
|
Re: Typecasting in C#
Zitat:
Aber Class Helper können ja (leider) auch keine neuen Properties einführen :? |
Re: Typecasting in C#
Zitat:
|
Re: Typecasting in C#
Mh.. Naja...
Aber "echte" Classhelper sind das nicht oder? Aufgerufen wird das ganze ja wie ich das sehe durch:
Code:
ooder?
ValueHolder.SetValue(ASocket,"Value");
|
Re: Typecasting in C#
Oh, dann eine
![]() Eine Socke(t) nun mal kein Kniestrumpf. Dazu ist er zu kurz. @Phoenix: Dann hab ich das nicht kapiert. :drunken: |
Re: Typecasting in C#
Zitat:
Code:
C#3+ vorrausgesetzt, natürlich.
ASocket.SetValue("Value");
|
Re: Typecasting in C#
Zitat:
Man muss dann nur noch die weiteren Parameter angeben. Das hier ist meine Parade-Extension Method:
Code:
Und der Aufruf is dann eben:
namespace smartDev.Extensions
{ public static class StringExtender { public static Boolean IsEmpty(this String value) { return String.IsNullOrEmpty(value); } } }
Code:
Bedingung ist, dass der Namespace der Extension Method in der using-Klausel liegt.
if (myString.IsEmpty()) { myString = "Blubb"; }
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz