[CSharp.net] RE: [CSharp.net] AW:Reflection über Interface

Peter Koen csharp.net at glengamoi.com
Mon, 29 Mar 2004 13:55:37 +0200


Nein, die Frage war eher ob du das in der Klasse dann public, private oder
protected hast. Der Accessmodifier muß natürlich zum Context passen.

Außerdem solltest du ein Invoke immer gegen das Object machen, das
instanziert wurde, nicht gegen das interface. Das Interface dient nur der
Informationsbeschaffung was das Object implementiert.

Und wenn sowohl Interface als auch Methode von Anfang an feststehen is
Reflection der definitiv falsche Weg (Performance, Late Binding!).

Aufpassen mußt du noch falls das Projekt in mehrere DLLs zerlegt ist, dass
die, in der das Interface definiert ist nicht mehrfach vorhanden ist durch
Referenzen (bspw. in einem unterverzeichnis). Dann würde sich nämlich die
AssemblyIdentity unterscheiden und der Aufruf von Invoke auf das Objekt wäre
trotz erfolgreichem TypInfo ermitteln nicht gültig!

lG
Peter 

> -----Original Message-----
> From: csharp.net-admin@glengamoi.com 
> [mailto:csharp.net-admin@glengamoi.com] On Behalf Of Mansur 
> Esmann [OM]
> Sent: Monday, March 29, 2004 1:48 PM
> To: csharp.net@glengamoi.com
> Subject: [CSharp.net] AW:Reflection über Interface
> 
> Genau .... das wollte ich gerade noch schreiben:
> 
> IFrame nform = form as IFrame;
> nform.Save();
> 
> Das geht ....
> 
> Im Memberinfo steht es aber scheibar net:
> MethodInfo mi = t.GetMethod("Save");
> 			if(mi != null)
> 				mi.Invoke(nform, null);
> 
> Das Interface schaut folgendermaßen aus:
> 
> 	public interface IFrame
> 	{
> 		frmMain Parent
> 		{
> 			get;
> 			set;
> 		}
> 		string HelpFile
> 		{
> 			get;
> 		}
> 
> 		string FrameTitle
> 		{
> 			get;
> 		}
> 
> 		string[] Action
> 		{
> 			get;
> 			set;
> 		}
> 
> 		void Save();
> 
> 	}
> 
> Ein Public kann ich gar nicht angeben .... "public ist für 
> dieses Element nicht gültig"
> 
> Im Childframe schreibe ich dann folgendes (Das hatte ich aber 
> schon gepostet):
> void IFrame.Save()
> 		{
> 			MessageBox.Show("speichern");
> 		}
> 
> 
> 
> > Das kann nicht sein.
> > wenn deine form Variable von einem Typen abgeleitet ist der IFrame 
> > implementiert, dann muß folgender Code reichen:
> >
> > IFrame frame = form as IFrame;
> > if(frame!=null)
> > 	frame.Save();
> >
> > Einziger Grund wo das mit Reflection nicht hinhauen könnte: Save =
is 
> > private und du hast keine passenden BindingFlags mitgegeben 
> fürs Invoke.
> >
> > lG
> > Peter
> >
> > > -----Original Message-----
> > > From: csharp.net-admin@glengamoi.com 
> > > [mailto:csharp.net-admin@glengamoi.com] On Behalf Of 
> Mansur Esmann 
> > > [OM]
> > > Sent: Monday, March 29, 2004 1:35 PM
> > > To: csharp.net@glengamoi.com
> > > Subject: [CSharp.net] AW: [CSharp.net] RE: [CSharp.net] 
> Reflection 
> > > über Interface
> > >
> > > Dank!
> > > aber irgendwie will es nicht so richtig klappen ....
> > >
> > > 		private void toolBar1_ButtonClick(...)
> > > 		{
> > > 			IFrame nform = form as IFrame;
> > >
> > > 			Type t = nform.GetType();
> > >
> > > 			MethodInfo mi = t.GetMethod("Save");
> > > 			if(mi != null)
> > > 				mi.Invoke(nform, null);
> > > 		}
> > >
> > > IFrame ist mein Interface ...
> > > Ich bekomme aber nicht das Interface, sondern das Objekt dahinter 
> > > ..... das Childform.
> > > Eine Methode Save finde ich dann auch nicht, obwohl die ja im 
> > > Interface drinnen ist.
> > >
> > > Liege ich da jetzt irgendwie völlig daneben?
> > >
> > > Gruß Mansur
> > >
> > >
> > > >
> > > > Hallo,
> > > > Das hier sollte helfen:
> > > >
> > > > object o;
> > > > //o, beinhaltet das objekt, dass das interface supported
> > > >
> > > > //ermittle die gesuchte Methode eines Objekts Type t = 
> > > > o.GetType();
> > > >
> > > > MethodInfo mi = t.GetMethod("MeineMethode");
> > > > if(mi!=null)
> > > > 	mi.Invoke(o,null)
> > > >
> > > > alternativ, wenn das Interface und die Methode bekannt ist:
> > > >
> > > > MyInterface myInt = o as MyInterface; if(myInt != null)
> > > > 	myInt.MyMethod();
> > > >
> > > > lG
> > > > Peter
> > > >
> > > > > -----Original Message-----
> > > > > From: csharp.net-admin@glengamoi.com 
> > > > > [mailto:csharp.net-admin@glengamoi.com] On Behalf Of
> > > Mansur Esmann
> > > > > [OM]
> > > > > Sent: Monday, March 29, 2004 9:41 AM
> > > > > To: csharp.net@glengamoi.com
> > > > > Subject: [CSharp.net] Reflection über Interface
> > > > >
> > > > > Hallo,
> > > > >
> > > > > ich habe in einem Interface eine Methode:
> > > > > public interface IFrame{
> > > > > 	void Save();
> > > > > }
> > > > >
> > > > > In einem Childformular implementiere ich die Methode:
> > > > > void IFrame.Save()
> > > > > {
> > > > > 	MessageBox.Show("speichern...."); }
> > > > >
> > > > >
> > > > > Jetzt will ich über reflection:
> > > > > a.) Rausfinden welche Methoden zur Verfügung stehen
> > > > > b.) Falls gefunden die Methode ausführen
> > > > >
> > > > > Also a.) War kein Problem ....
> > > > > Aber b.) das kriege ich nicht hin ....
> > > > >
> > > > > InvokeMethode .... damit meine ich kann man das machen ....
> > > > > Ein googeln hat mir aber kein verständliches Beispiel
> > > gebracht, wo
> > > > > das mit einem Interface gemacht wird ....
> > > > >
> > > > > Hat da jemand ein Beispiel und ggf. ein paar Zeilen
> > > Erläuterung dazu?
> > > > >
> > > > > Gruß Mansur
> > > > >
> > > > > _______________________________________________
> > > > > CSharp.net Mailingliste, Postings senden an:
> > > > > CSharp.net@glengamoi.com
> > > > > An-/Abmeldung und Suchfunktion unter:
> > > > > http://www.glengamoi.com/mailman/listinfo/csharp.net
> > > > >
> > > >
> > > > _______________________________________________
> > > > CSharp.net Mailingliste, Postings senden an:
> > > > CSharp.net@glengamoi.com
> > > > An-/Abmeldung und Suchfunktion unter:
> > > > http://www.glengamoi.com/mailman/listinfo/csharp.net
> > >
> > > _______________________________________________
> > > CSharp.net Mailingliste, Postings senden an:
> > > CSharp.net@glengamoi.com
> > > An-/Abmeldung und Suchfunktion unter:
> > > http://www.glengamoi.com/mailman/listinfo/csharp.net
> > >
> >
> > _______________________________________________
> > CSharp.net Mailingliste, Postings senden an:
> > CSharp.net@glengamoi.com
> > An-/Abmeldung und Suchfunktion unter:
> > http://www.glengamoi.com/mailman/listinfo/csharp.net
> 
> _______________________________________________
> CSharp.net Mailingliste, Postings senden an:
> CSharp.net@glengamoi.com
> An-/Abmeldung und Suchfunktion unter:
> http://www.glengamoi.com/mailman/listinfo/csharp.net
>