Jede .net-Assembly enthält zusätzlich zum Code weitere Metadaten. Zu den Metadaten gehören Informationen über die Assembly selbst, z. B. die Versionsnummer, die Assembly, auf die verwiesen wird, sowie alle Arten von Informationen, einschließlich ihrer Methoden, Eigenschaften und Felder. Mittels .net Reflection können diese Informationen zur Laufzeit gelesen und Methoden dynamisch aufgerufen werden.
Das Projekt ist fast fertig und ich habe endlich Zeit, einen Blog zu schreiben.
Machen Sie ein Beispiel für den dynamischen Aufruf einer Assembly-spezifischen Methode.
Projekt 1 (Demo) enthält eine Testklasse und eine getList-Methode wird in die Testklasse geschrieben. Die von dieser Methode zurückgegebenen Daten werden manuell hinzugefügt. Der Quellcode lautet wie folgt:
Projekt 1
Verwenden des Systems;
mit System.Collections.Generic;
Verwenden von System.Text;
mit System.Data;
Namespace-Demo
{
Öffentlicher Klassentest
{
öffentliche Datentabelle getList(string id)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id"));
dt.Columns.Add(new DataColumn("name"));
dt.Columns.Add(new DataColumn("sex"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "Zhang Ling";
dr["sex"] = "männlich";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "李思";
dr["sex"] = "weiblich";
dt.Rows.Add(dr);
dt zurückgeben;
}
}
}
Projekt 2 (DemoXml) enthält eine Test-Klasse. Eine getList-Methode wird in die Test-Klasse geschrieben. Die von dieser Methode zurückgegebenen Daten werden aus der Datenbank gelesen. Der Quellcode lautet wie folgt:
Projekt 2
Verwenden des Systems;
mit System.Collections.Generic;
Verwenden von System.Text;
Verwenden von System.Data;
Verwenden von System.Data.SqlClient;
mit System.Xml;
Namespace DemoXml
{
Öffentlicher Klassentest
{
private SqlConnection cn;
öffentliche Datentabelle getList(string id)
{
versuchen
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
cmd.CommandText = „SELECT au_id als id, au_lname als Name, au_fname als Geschlecht von Autoren“;
cmd.CommandType = CommandType.Text;
cmd.Connection = cn;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
dt zurückgeben;
}
Catch (Ausnahme ex)
{
throw new ApplicationException("Ausnahme aufgetreten: "+ex.Message+ex.StackTrace);
}
Endlich
{
cn.Close();
cn = null;
}
}
}
}
Projekt 3 (WebDemo) demonstriert die dynamische Verwendung der getList-Methode in der angegebenen Assembly, um eine DataTable zurückzugeben, und die Verwendung einer Gridview, um die zurückgegebenen Daten anzuzeigen.
Rufen Sie die Demo an
Verwenden des Systems;
Verwenden von System.Data;
Verwenden von System.Configuration;
mit System.Web;
mit System.Web.Security;
mit System.Web.UI;
mit System.Web.UI.WebControls;
mit System.Web.UI.WebControls.WebParts;
mit System.Web.UI.HtmlControls;
unter Verwendung von System.Reflection;
öffentliche Teilklasse _Default: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DropBind();
}
}
Dateninitialisierung, kann in der web.config-Datei konfiguriert werden. #region Dateninitialisierung, kann in der web.config-Datei konfiguriert werden
public void DropBind()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("name"));
dt.Columns.Add(new DataColumn("filepath"));
DataRow dr = dt.NewRow();
dr["name"] = "Eigene Daten laden";
dr["filepath"] = Server.MapPath(@"FilesDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "XML-Daten laden";
dr["filepath"] = Server.MapPath(@"FilesDemoXml.dll");
dt.Rows.Add(dr);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "name";
this.DropDownList1.DataValueField = "filepath";
this.DropDownList1.DataBind();
}
#endregion
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
versuchen
{
//Lesen Sie die angegebene DLL-Datei und wählen Sie sie aus
string strPath = (sender as DropDownList).SelectedValue.Trim();
string NameSpace = this.DropDownList1.SelectedIndex == 0 ? "Demo.Test" : "DemoXml.Test";
//Lade die angegebene Assembly in den Speicher
Assembly Assembly = Assembly.LoadFrom(strPath);
//Ein angegebenes Objekt in der Assembly zurückgeben. Wenn alle Objekte zurückgegeben werden, verwenden Sie GetTypes(), um ein Array von Type-Objekten zurückzugeben.
Typ T = Assembly.GetType(NameSpace);
//Methodeninformationen zurückgeben (öffentliche Methode)
MethodInfo mi = T.GetMethod("getList");
//Erstelle ein Objekt basierend auf dem vorherigen Typ
object o = Activator.CreateInstance(T);
//Parameter
object[] par = neues Objekt[] { "E01" };
// Rufen Sie diese Methode dynamisch über die Invoke-Methode des MethodInfo-Objekts auf. Der Parameter o liegt daran, dass für die Instanzmethode beim Aufruf eine Instanz vorhanden sein muss.
DataTable dt = (DataTable)mi.Invoke(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
Catch (Ausnahme ex)
{
//doException
}
}
}
Die Metadaten im Assembly-Objekt, das von der Assembly.LoadFrom-Methode zurückgegeben wird, können gelesen werden. GetType unter ihnen gibt ein Typobjekt zurück, das zur Darstellung der angegebenen Assembly verwendet wird (das Lesen aller Typen in der Assembly und die Verwendung von GetTypes gibt ein Array von Typobjekten zurück).
Informationen zur Rückgabemethode (öffentliche Methode)
MethodInfo mi = T.GetMethod("getList");
Erstellen Sie ein Objekt basierend auf dem vorherigen Typ
object o = Activator.CreateInstance(T);
Parameter
object[] par = neues Objekt[] { "E01" };
Diese Methode wird dynamisch über die Invoke-Methode des MethodInfo-Objekts aufgerufen. Der Parameter o liegt daran, dass für die Instanzmethode beim Aufruf eine Instanz vorhanden sein muss.
DataTable dt = (DataTable)mi.Invoke(o, par);
Die vom Aufruf zurückgegebenen Daten werden in der Liste angezeigt.
Beispiel-Download: