Frage

Ich programmiere WCF die Channel verwenden, die eine Art, um erwartet, dass die Create Methode aufzurufen. Zum Beispiel:

IProxy proxy = ChannelFactory<IProxy>.CreateChannel(...);

In meinem Fall mache ich Routing, damit ich weiß nicht, was mein Kanalfactory Typen verwendet wird. Ich kann einen Nachrichtenkopf analysieren, um die Art zu bestimmen, aber ich traf dort eine Mauer, denn selbst wenn ich eine Instanz von Typ haben kann ich nicht, dass passieren, wo Channel eine generische Art erwartet.

Eine weitere Möglichkeit, dieses Problem der Neuformulierung in sehr einfachen Worten wäre, dass ich versuchen, so etwas zu tun:

string listtype = Console.ReadLine(); // say "System.Int32"
Type t = Type.GetType( listtype);
List<t> myIntegers = new List<>(); // does not compile, expects a "type"
List<typeof(t)> myIntegers = new List<typeof(t)>(); // interesting - type must resolve at compile time?

Gibt es eine Annäherung an das ich innerhalb von C # nutzen kann?

War es hilfreich?

Lösung

Was Sie suchen ist Makegenerictype

string elementTypeName = Console.ReadLine();
Type elementType = Type.GetType(elementTypeName);
Type[] types = new Type[] { elementType };

Type listType = typeof(List<>);
Type genericType = listType.MakeGenericType(types);
IProxy  proxy = (IProxy)Activator.CreateInstance(genericType);

Also, was Sie tun, ist die Art-Definition der generischen „template“ Klasse bekommen, dann eine Spezialisierung des Typs mit Ihrem Runtime-driving Bautypen.

Andere Tipps

Sie sollten auf diesem Posten aus Ayende aussehen: WCF, Mocking und IoC: Oh My! . Irgendwo in der Nähe der Unterseite ist ein Verfahren namens GetCreationDelegate, die helfen sollen. Es besteht im Wesentlichen Folgendes aus:

string typeName = ...;
Type proxyType = Type.GetType(typeName);

Type type = typeof (ChannelFactory<>).MakeGenericType(proxyType);

object target = Activator.CreateInstance(type);

MethodInfo methodInfo = type.GetMethod("CreateChannel", new Type[] {});

return methodInfo.Invoke(target, new object[0]);

Hier ist eine Frage: Haben Sie wirklich müssen einen Kanal mit dem genauen Vertragstyp in Ihrem speziellen Fall erstellen

?

Da Sie Routing tun, ist es eine sehr gute Chance, dass Sie einfach mit den generischen Kanalformen umgehen können. Zum Beispiel sind, wenn Sie eine Einbahn nur Nachrichten-Routing, dann können Sie einen Kanal erstellen, die Nachricht zu senden, wie folgt aus:

ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint);
IOutputChannel channel = factory.CreateChannel();
...
channel.SendMessage(myRawMessage);

Wenn Sie einen Zwei-Wege-Dienst senden benötigt, verwenden Sie einfach IRequestChannel statt.

Wenn Sie Routing tun, es ist in der Regel viel einfacher zu handhaben nur mit generischem Kanalformen (mit einem generischen Catch-All-Service-Vertrag nach außen) und nur sicherstellen, dass die Nachricht Sie senden hat alle richtigen Header und Eigenschaften.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top