Ursprünglich geschrieben, um eine Liste zu kopieren, die in einem SOAP-Namespace MyOldService zu einer Klasse desselben Layouts in einem neuen Namespace MyNewService definiert wird. Das Problem ist, dass bei Soap-Klassen, wenn ich den MyOldService-Namespace in einen dritten Namespace, sagen wir MyOtherAppService, importiere, dann wird meine AddressList-Klasse ein Mitglied dieses dritten Namespace und wird als solcher referenziert.Wie kann ich einen Namespace an eine Methode übergeben?
Also, anstatt den Code zu duplizieren, würde ich es dekorieren (oder irgendwie anpassen) mit etwas ähnlich wie Generika (die ich verstehe, wird nicht funktionieren, weil ich den Namespace, nicht nur einen behoben type [es gibt mehrere Typen, die ich von jedem Namespace benötige, wie aus dem Snippet ersichtlich ist], um es zu ermöglichen, die Adressliste in die entsprechende Klasse in dem Namespace zu konvertieren, der benötigt wird. Möglich?
Bearbeiten: Als Antwort auf einige der folgenden Kommentare, werde ich versuchen, ein besseres Beispiel zu definieren, was ich versuche zu tun.
Drei Klassen importiert von WSDLs über Web-Referenzen (nein, diese werden nicht kompiliert, nur Beispiele zur Veranschaulichung). Die Klassen AddressList haben alle das gleiche Layout.
namespace A
{
enum Mode {};
enum Creator {};
class ATypeClass {}
public partial class AddressList
{
int id;
enum Mode mode;
enum Creator creator
long[] siteList;
ATypeClass[] cspList;
}
}
namespace B
{
enum Mode {};
enum Creator {};
class BTypeClass {}
public partial class AddressList
{
int id;
enum Mode mode;
enum Creator creator
long[] siteList;
BTypeClass[] cspList;
}
}
namespace C
{
enum Mode {};
enum Creator {};
class CTypeClass {}
public partial class AddressList
{
int id;
string name;
enum Mode mode;
enum Creator creator
long[] siteList;
CTypeClass[] cspList;
}
}
Ich werde die partielle Klasse im Namensraum A mit einer neuen Methode erweitern:
namespace A
{
public partial class AddressList
{
public T.AddressList ToPrivateAddressList<T>()
{
T.AddressList privAddrList = new T.AddressList();
privAddrList.creator = (T.Creator)this.creator;
privAddrList.id = this.id;
privAddrList.name = this.name;
privAddrList.mode = (T.Mode)this.mode;
if (this.siteList != null && this.listType == Mode.XDAddressingModeSiteIDList)
{
privAddrList.siteList = new long[this.siteList.Length];
Array.Copy(this.siteList, privAddrList.siteList, this.siteList.Length);
}
...
}
}
}
Beachten Sie, dass ein Teil des Problems, zusätzlich zu den Klassen jeweils Teil eines anderen Namespace, sind die Enums, die auch aus den verschiedenen Namespaces stammen.
Schließlich Ich sehe es wie so nennen (obwohl ich weiß, ich kann das nicht wirklich tun, ich bin für eine Lösung, die etwa so elegant ist):
B.AddressList al1 = A.AddressList.ToPrivateAddressList<B>();
C.AddressList al1 = A.AddressList.ToPrivateAddressList<C>();
Wo ist das Problem mit Referenzierung? Sie können immer auf eine Klasse mit ihrem vollständigen Namen (namespacename.classname) verweisen, oder? – Vlad
Ich denke, er will in der Lage sein, die Adresse Klasse ohne eine FQN – payo
@payo zu reflecting: Ich glaube nicht, dass diese Bequemlichkeit extra Code wert ist :) – Vlad