Cada ensamblado .net contiene metadatos adicionales además del código. Los metadatos incluyen información sobre el ensamblado en sí, como el número de versión, a qué ensamblado se hace referencia y todo tipo de información, incluidos sus métodos, propiedades y campos. Al utilizar la reflexión .net, esta información se puede leer en tiempo de ejecución y los métodos se pueden llamar dinámicamente.
El proyecto está casi terminado y finalmente tengo tiempo para escribir un blog.
Haga un ejemplo de llamada dinámica a un método específico de un ensamblado.
El Proyecto 1 (Demostración) contiene una clase de Prueba y un método getList está escrito en la clase de Prueba. Los datos devueltos por este método se agregan manualmente. El código fuente es el siguiente:
Proyecto 1
usando Sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Data
Demostración del espacio de nombres
;
{
prueba de clase pública
{
tabla de datos pública getList (identificación de cadena)
{
Tabla de datos dt = nueva Tabla de datos();
dt.Columns.Add(new DataColumn("id"));
dt.Columns.Add(new DataColumn("nombre"));
dt.Columns.Add(new DataColumn("sexo"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["nombre"] = "Zhang Ling";
dr["sexo"] = "masculino";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["nombre"] = "李思";
dr["sexo"] = "mujer";
dt.Rows.Add(dr);
devolver dt;
}
}
}
El proyecto 2 (DemoXml) contiene una clase de prueba. Un método getList está escrito en la clase de prueba. Los datos devueltos por este método se leen de la base de datos. El código fuente es el siguiente:
Proyecto 2
usando Sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Data;
usando System.Data.SqlClient;
usando System.Xml;
espacio de nombres DemoXml
{
prueba de clase pública
{
Conexión Sql privada cn;
tabla de datos pública getList (identificación de cadena)
{
intentar
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = nuevo SqlCommand();
SqlDataAdapter da = nuevo SqlDataAdapter();
cmd.CommandText = "SELECCIONE au_id como id,au_lname como nombre,au_fname como sexo de los autores";
cmd.CommandType = CommandType.Text;
cmd.Conexión = cn;
da.SelectCommand = cmd;
Tabla de datos dt = nueva Tabla de datos();
da.Relleno(dt);
devolver dt;
}
captura (Excepción ex)
{
lanzar nueva ApplicationException("Se produjo una excepción: "+ex.Message+ex.StackTrace);
}
finalmente
{
cn.Cerrar();
cn = nulo;
}
}
}
}
El Proyecto 3 (WebDemo) demuestra dinámicamente el uso del método getList en el ensamblado especificado para devolver una tabla de datos y el uso de una vista de cuadrícula para mostrar los datos devueltos.
Llame a la demostración
usando Sistema;
usando System.Data;
usando System.Configuration;
usando System.Web;
utilizando System.Web.Security;
utilizando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls;
usando System.Reflection
clase parcial pública _Default: System.Web.UI.Page
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
si (!IsPostBack)
{
SoltarBind();
}
}
Inicialización de datos, se puede configurar en el archivo web.config #region Inicialización de datos, se puede configurar en el archivo web.config
DropBind vacío público ()
{
Tabla de datos dt = nueva Tabla de datos();
dt.Columns.Add(new DataColumn("nombre"));
dt.Columns.Add(new DataColumn("ruta de archivo"));
DataRow dr = dt.NewRow();
dr["name"] = "Carga tus propios datos";
dr["filepath"] = Server.MapPath(@"FilesDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "Cargar datos xml";
dr["filepath"] = Server.MapPath(@"FilesDemoXml.dll");
dt.Rows.Add(dr);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "nombre";
this.DropDownList1.DataValueField = "ruta del archivo";
this.DropDownList1.DataBind();
}
#endregion
protected void DropDownList1_SelectedIndexChanged (remitente del objeto, EventArgs e)
{
intentar
{
//Leer y seleccionar el archivo dll especificado
string strPath = (remitente como DropDownList).SelectedValue.Trim();
cadena NameSpace = this.DropDownList1.SelectedIndex == 0 "Demo.Test": "DemoXml.Test";
//Carga el ensamblado especificado en la memoria
Asamblea asamblea = Asamblea.LoadFrom(strPath);
// Devuelve un objeto especificado en el ensamblado. Si se devuelven todos los objetos, utilice GetTypes() para devolver una matriz de objetos Type.
Escriba T = ensamblaje.GetType(NameSpace);
//Devuelve información del método (método público)
MethodInfo mi = T.GetMethod("getList");
//Crea un objeto basado en el tipo anterior
objeto o = Activador.CreateInstance(T);
//parámetro
objeto[] par = nuevo objeto[] { "E01" };
// Llame dinámicamente a este método a través del método Invoke del objeto MethodInfo. El parámetro o se debe a que el método de instancia requiere que exista una instancia cuando se llama.
DataTable dt = (DataTable)mi.Invoke(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
captura (Excepción ex)
{
//hacer excepción
}
}
}
Se pueden leer los metadatos del objeto Assembly devuelto por el método Assembly.LoadFrom. GetType entre ellos devolverá un objeto de tipo utilizado para representar el ensamblaje especificado (leer todos los tipos en el ensamblaje y usar GetTypes devolverá una matriz de objetos de tipo).
Información del método de devolución (método público)
MethodInfo mi = T.GetMethod("getList");
Crear un objeto basado en el tipo anterior.
objeto o = Activador.CreateInstance(T);
parámetro
objeto[] par = nuevo objeto[] { "E01" };
Este método se llama dinámicamente a través del método Invoke del objeto MethodInfo. El parámetro o se debe a que el método de instancia requiere que exista una instancia cuando se llama.
DataTable dt = (DataTable)mi.Invoke(o, par);
Los datos devueltos por la llamada se muestran en la lista.
Descarga de muestra: