Chaque assembly .net contient des métadonnées supplémentaires en plus du code. Les métadonnées incluent des informations sur l'assembly lui-même, telles que le numéro de version, l'assembly référencé, ainsi que tous les types d'informations, y compris ses méthodes, propriétés et champs. Grâce à la réflexion .net, ces informations peuvent être lues au moment de l'exécution et les méthodes peuvent être appelées dynamiquement.
Le projet est presque terminé, et j'ai enfin le temps d'écrire un blog,
Faites un exemple d’appel dynamique d’une méthode spécifique à l’assembly.
Le projet 1 (démo) contient une classe Test et une méthode getList est écrite dans la classe Test. Les données renvoyées par cette méthode sont ajoutées manuellement. Le code source est le suivant :
Projet 1
utiliser le système ;
en utilisant System.Collections.Generic ;
en utilisant System.Text ;
la démo de l'espace de noms
System.Data ;
{
Test de classe publique
{
public DataTable getList (identifiant de chaîne)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id"));
dt.Columns.Add(new DataColumn("nom"));
dt.Columns.Add(new DataColumn("sexe"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["nom"] = "Zhang Ling";
dr["sexe"] = "homme";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "李思";
dr["sexe"] = "femelle";
dt.Rows.Add(dr);
retourner dt ;
}
}
}
Le projet 2 (DemoXml) contient une classe Test. Une méthode getList est écrite dans la classe Test. Les données renvoyées par cette méthode sont lues dans la base de données. Le code source est le suivant :
Projet 2
utiliser le système ;
en utilisant System.Collections.Generic ;
en utilisant System.Text ;
en utilisant System.Data ;
en utilisant System.Data.SqlClient ;
en utilisant System.Xml ;
espace de noms DemoXml
{
Test de classe publique
{
cn privé SqlConnection ;
public DataTable getList (identifiant de chaîne)
{
essayer
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
cmd.CommandText = "SELECT au_id comme identifiant, au_lname comme nom, au_fname comme sexe parmi les auteurs";
cmd.CommandType = CommandType.Text;
cmd.Connection = cn;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
retourner dt ;
}
attraper (Exception ex)
{
throw new ApplicationException("Une exception s'est produite : "+ex.Message+ex.StackTrace);
}
enfin
{
cn.Close();
cn = nul ;
}
}
}
}
Le projet 3 (WebDemo) démontre l'utilisation dynamique de la méthode getList dans l'assembly spécifié pour renvoyer un DataTable et l'utilisation d'une vue en grille pour afficher les données renvoyées.
Appelez la démo
utiliser le système ;
en utilisant System.Data ;
en utilisant System.Configuration ;
en utilisant System.Web ;
en utilisant System.Web.Security ;
en utilisant System.Web.UI ;
en utilisant System.Web.UI.WebControls ;
en utilisant System.Web.UI.WebControls.WebParts ;
en utilisant System.Web.UI.HtmlControls ;
en utilisant System.Reflection ;
classe partielle publique _Default : System.Web.UI.Page
{
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
si (!IsPostBack)
{
DropBind();
}
}
Initialisation des données, configurable dans le fichier web.config #region Initialisation des données, configurable dans le fichier web.config
public vide DropBind()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("nom"));
dt.Columns.Add(new DataColumn("chemin du fichier"));
DataRow dr = dt.NewRow();
dr["name"] = "Charger vos propres données";
dr["filepath"] = Server.MapPath (@"FilesDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "Charger les données XML";
dr["filepath"] = Server.MapPath (@"FilesDemoXml.dll");
dt.Rows.Add(dr);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "nom" ;
this.DropDownList1.DataValueField = "chemin du fichier" ;
this.DropDownList1.DataBind();
}
#endregion
protected void DropDownList1_SelectedIndexChanged(objet expéditeur, EventArgs e)
{
essayer
{
//Lire et sélectionner le fichier dll spécifié
string strPath = (expéditeur en tant que DropDownList).SelectedValue.Trim();
string NameSpace = this.DropDownList1.SelectedIndex == 0 "Demo.Test" : "DemoXml.Test";
//Charge l'assembly spécifié en mémoire
Assemblage assembly = Assembly.LoadFrom(strPath);
//Renvoie un objet spécifié dans l'assembly. Si tous les objets sont renvoyés, utilisez GetTypes() pour renvoyer un tableau d'objets Type.
Tapez T = assembly.GetType(NameSpace);
//Retourne les informations sur la méthode (méthode publique)
MethodInfo mi = T.GetMethod("getList");
//Créer un objet basé sur le type précédent
objet o = Activator.CreateInstance(T);
//paramètre
objet[] par = nouvel objet[] { "E01" };
//Appelez dynamiquement cette méthode via la méthode Invoke de l'objet MethodInfo. Le paramètre o est dû au fait que la méthode d'instance nécessite qu'une instance existe lorsqu'elle est appelée.
DataTable dt = (DataTable)mi.Invoke(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
attraper (Exception ex)
{
//faireException
}
}
}
Les métadonnées de l'objet Assembly renvoyées par la méthode Assembly.LoadFrom peuvent être lues. GetType parmi eux renverra un objet de type utilisé pour représenter l'assembly spécifié (la lecture de tous les types de l'assembly et l'utilisation de GetTypes renverront un tableau d'objets de type).
Informations sur la méthode de retour (méthode publique)
MethodInfo mi = T.GetMethod("getList");
Créer un objet basé sur le type précédent
objet o = Activator.CreateInstance(T);
paramètre
objet[] par = nouvel objet[] { "E01" };
Cette méthode est appelée dynamiquement via la méthode Invoke de l'objet MethodInfo. Le paramètre o est dû au fait que la méthode d'instance nécessite qu'une instance existe lorsqu'elle est appelée.
DataTable dt = (DataTable)mi.Invoke(o, par);
Les données renvoyées par l'appel sont affichées dans la liste.
Exemple de téléchargement :