Cada assembly .net contém metadados adicionais além do código. Os metadados incluem informações sobre o próprio assembly, como número de versão, qual assembly é referenciado e todos os tipos de informações, incluindo seus métodos, propriedades e campos. Usando a reflexão .net, essas informações podem ser lidas em tempo de execução e os métodos podem ser chamados dinamicamente.
O projeto está quase concluído e finalmente tenho tempo para escrever um blog,
Faça um exemplo de chamada dinâmica de um método específico do assembly.
O Projeto 1 (Demo) contém uma classe Test e um método getList é escrito na classe Test. Os dados retornados por este método são adicionados manualmente. O código fonte é o seguinte:
Projeto 1
usando o sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Data
demonstração
;
{
Teste de classe pública
{
getList de DataTable pública (string id)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id"));
dt.Columns.Add(new DataColumn("nome"));
dt.Columns.Add(new DataColumn("sexo"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["nome"] = "Zhang Ling";
dr["sexo"] = "masculino";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["nome"] = "李思";
dr["sexo"] = "feminino";
dt.Rows.Add(dr);
retornar dt;
}
}
}
O Projeto 2 (DemoXml) contém uma classe Test. Um método getList é escrito na classe Test. Os dados retornados por este método são lidos do banco de dados. O código fonte é o seguinte:
Projeto 2
usando o sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Data;
usando System.Data.SqlClient;
usando System.Xml;
namespace DemoXml
{
Teste de classe pública
{
SqlConnection privada cn;
getList de DataTable pública (string id)
{
tentar
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
cmd.CommandText = "SELECIONE au_id como id,au_lname como nome,au_fname como sexo dos autores";
cmd.CommandType = CommandType.Text;
cmd.Conexão = cn;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
retornar dt;
}
pegar (exceção ex)
{
throw new ApplicationException("Ocorreu uma exceção: "+ex.Message+ex.StackTrace);
}
finalmente
{
cn.Fechar();
cn = nulo;
}
}
}
}
O Projeto 3 (WebDemo) demonstra dinamicamente o uso do método getList no assembly especificado para retornar um DataTable e o uso de um gridview para exibir os dados retornados.
Chame a demonstração
usando o sistema;
usando System.Data;
usando System.Configuration;
usando System.Web;
usando System.Web.Security;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls;
usando System.Reflection;
classe parcial pública _Default: System.Web.UI.Page;
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
se (!IsPostBack)
{
DropBind();
}
}
Inicialização de dados, pode ser configurada no arquivo web.config #region Inicialização de dados, pode ser configurada no arquivo web.config
public void DropBind()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("nome"));
dt.Columns.Add(new DataColumn("caminho do arquivo"));
DataRow dr = dt.NewRow();
dr["name"] = "Carregue seus próprios dados";
dr["filepath"] = Server.MapPath(@"ArquivosDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "Carregar dados xml";
dr["filepath"] = Server.MapPath(@"ArquivosDemoXml.dll");
dt.Rows.Add(dr);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "nome";
this.DropDownList1.DataValueField = "caminho do arquivo";
this.DropDownList1.DataBind();
}
#endregion
protegido void DropDownList1_SelectedIndexChanged(objeto remetente, EventArgs e)
{
tentar
{
//Leia e selecione o arquivo dll especificado
string strPath = (remetente como DropDownList).SelectedValue.Trim();
string NameSpace = this.DropDownList1.SelectedIndex == 0? "Demo.Test": "DemoXml.Test";
//Carrega o assembly especificado na memória
Montagem montagem = Assembly.LoadFrom(strPath);
//Retorna um objeto especificado no assembly Se todos os objetos forem retornados, use GetTypes() para retornar um array de objetos Type.
Digite T = assembly.GetType(NameSpace);
//Retorna informações do método (método público)
MethodInfo mi = T.GetMethod("getList");
//Cria um objeto baseado no tipo anterior
objeto o = Ativador.CreateInstance(T);
//parâmetro
objeto[] par = novo objeto[] { "E01" };
//Chamar dinamicamente este método através do método Invoke do objeto MethodInfo O parâmetro o ocorre porque o método de instância requer que exista uma instância quando chamado.
DataTable dt = (DataTable)mi.Invoke(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
pegar (exceção ex)
{
//doException
}
}
}
Os metadados no objeto Assembly retornado pelo método Assembly.LoadFrom podem ser lidos. GetType entre eles retornará um objeto de tipo usado para representar o assembly especificado (ler todos os tipos no assembly e usar GetTypes retornará uma matriz de objetos de tipo).
Informações do método de retorno (método público)
MethodInfo mi = T.GetMethod("getList");
Crie um objeto baseado no tipo anterior
objeto o = Ativador.CreateInstance(T);
parâmetro
objeto[] par = novo objeto[] { "E01" };
Este método é chamado dinamicamente por meio do método Invoke do objeto MethodInfo. O parâmetro o ocorre porque o método de instância requer que exista uma instância quando chamado.
DataTable dt = (DataTable)mi.Invoke(o, par);
Os dados retornados pela chamada são exibidos na lista.
Download de amostra: