Der Aufruf der Methoden der Assembly wird durch Reflektion ihres Besitzers in .NET erstellt

StackOverflow https://stackoverflow.com/questions/7334670

  •  27-10-2019
  •  | 
  •  

Frage

Ich weiß, wie man ein Objekt durch Reflexion erstellt und einige Argumente übergibt.

Dim assembly As System.Reflection.Assembly
Dim control As Object

assembly = System.Reflection.Assembly.Load("WpfControlLibrary1")
control = assembly.CreateInstance("WpfControlLibrary1.Main")

control.Maximize("true")

Meine Frage ist, ob es einen Ansatz gibt, um Informationen von "dem Steuerelement" in "den Eigentümer" dieses "Steuerelements" zu übertragen.

Ich denke, es sollte eine Möglichkeit sein, eine bidirektionale Interaktion zwischen dem Eigentümer und der erstellten Baugruppe herzustellen.

Zum Beispiel möchte ich innerhalb eines Timers regelmäßig die Zustände der "Steuerung" abrufen.

foreach(...)
{

var state = control.GetState(); // ????? Is it possible ?
Sleep(10000);

}

Hier sehen wir, wie die Parameter übergeben werden

Ich muss also ein zurückgegebenes Objekt zurückholen.

Vielen Dank im Voraus für jeden nützlichen Hinweis, den meine Brüder und Schwestern beim Programmieren erhalten haben!

War es hilfreich?

Lösung

Um die für Klassen in einer anderen Assembly definierte Methode aufzurufen, benötigen Sie Folgendes:

Assembly assembly = Assembly.Load("OtherAssembly");
Type controlType = assembly.GetType("OtherAssembly.OtherAssemblyClass");
object control = Activator.CreateInstance(controlType);

controlType.InvokeMember("SetFullName", BindingFlags.InvokeMethod, null, 
                         control, new object[] { "FirstName", "LastNameski" });

Dadurch wird die Methode SetFullName der Klasse OtherAssemblyClass der Assembly OtherAssembly für das Objekt control unter Verwendung der Parameter "FirstName" und "LastNameski" aufgerufen

object result = controlType.InvokeMember("GetFullName", 
                            BindingFlags.InvokeMethod, null, control, null);

Dadurch wird eine Methode namens GetFullName für dasselbe Objekt aufgerufen, die keine Parameter akzeptiert (daher der letzte null im Aufruf) und eine Zeichenfolge zurückgibt.

Console.WriteLine(result.GetType().FullName);

Dies druckt den "System.String" aus

Console.WriteLine(result);

Hiermit wird der generische Codetagcode ausgedruckt.


Im Beispiel enthält die andere Assembly diese Klasse:

namespace OtherAssembly
{
  public class OtherAssemblyClass
  {
    private string firstName;
    private string lastName;

    public string GetFullName()
    {
        return firstName + " " + lastName;
    }

    public void SetFullName(string first, string last)
    {
        firstName = first;
        lastName = last;
    }
  }
}

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