Invoke Methode mit "Explicit type arguments", möglich oder nicht?

21/12/2009 - 15:10 von Milan | Report spam
Hallo alle,

Ich muss reimplementieren die folgendes Method abruf "Cast<IMyClass>()" mit
dem Reflection:
IEnumerable<IMyClass> tMyList = wrapper ( ).Cast<IMyClass>();

Deklaration von wrapper ist:
object wrapper ( );

wrapper() Methode hat "object" wie ruckgabe Typ und ist Initiealiziert
innerhalb "wrapper" mit Object von Typ "IList<MyClass>"

Dek.von Klasse:
class MyClass: IMyClass {}

Weil wrapper hat rückgabe Wert "object" es ist nicht möglich Direkt "Cast"
Methode zu zugreifen.Wie kann man Refletion benutzen um "Cast<IMyClass>()"
Methode abzurufen ?
Wie uberhaupt ruft man eine Methode die hat "explicit type argument" z.B.
Cast<IMyClass>() ?


Grüße,
Milan.
 

Lesen sie die antworten

#1 Marvin Massih
22/12/2009 - 03:44 | Warnen spam
Hallo Milan,

Milan schrieb:
Ich muss reimplementieren die folgendes Method abruf "Cast<IMyClass>()" mit
dem Reflection:
IEnumerable<IMyClass> tMyList = wrapper ( ).Cast<IMyClass>();

Deklaration von wrapper ist:
object wrapper ( );



Ok.

wrapper() Methode hat "object" wie ruckgabe Typ und ist Initiealiziert
innerhalb "wrapper" mit Object von Typ "IList<MyClass>"



IList<T> besitzt keine Cast-Methode.
Das ist eine Erweiterungsmethode:

[ Erweiterungsmethoden (C#-Programmierhandbuch) ]
http://msdn.microsoft.com/de-de/lib...83977.aspx

Außerdem: Wenn wrapper bereits IList<IMyClass> zurückliefert, ist es
völlig überflüssen einzeln jedes Element zu casten. Genau das tut Cast aber!

Dek.von Klasse:
class MyClass: IMyClass {}



Ok, aber was hat das mit dem Rest zu tun?

Weil wrapper hat rückgabe Wert "object" es ist nicht möglich Direkt "Cast"
Methode zu zugreifen.



Die benötigst Du auch überhaupt nicht, wenn wrapper IList<IMyClass>
zurückliefert:

IList<IMyClass> list = (IList<IMyClass>)wrapper( );

Wie kann man Refletion benutzen um "Cast<IMyClass>()"
Methode abzurufen ?



Indem Du Dich informierst, was Erweiterungsmethoden sind.

Wie uberhaupt ruft man eine Methode die hat "explicit type argument" z.B.
Cast<IMyClass>() ?



Prinzipiell:

Type clazz; // Typ der enthaltenden Klasse
MethodInfo method = clazz.GetMethod( "GenericMethod" );
MethodInfo methodWithTypeArgs = method.MakeGenericMethod(
typeof( IMyClass )
);

Ich würde hier allerdings selbst in dem Fall, dass wrapper nicht bereits
ohnehin IList<IMyClass> zurückliefern würde, nicht per Reflection die
Cast-Erweiterungsmethode aufrufen, da diese zu LINQ gehört (deshalb habe
ich das hier auch bewusst nicht als Beispiel gewàhlt).
In dem Fall solltest Du die Operation stattdessen selbst implementieren,
z.B. so (aus dem Kopf, ungetestet):

private static IList<IMyClass> Cast( ICollection c )
{
List<IMyClass> cast = new List<IMyClass>( c.Count );
foreach( IMyClass obj in c )
cast.Add( obj );
return cast;
}

Viele Grüße

Marvin

Marvin Massih | http://www.marvin-massih.de

Ähnliche fragen