모든 .net 어셈블리에는 코드 외에 추가 메타데이터가 포함되어 있습니다. 메타데이터에는 참조되는 어셈블리의 버전 번호와 같은 어셈블리 자체에 대한 정보와 해당 메서드, 속성 및 필드를 포함한 모든 유형의 정보가 포함됩니다. .net 리플렉션을 사용하면 이 정보를 런타임에 읽을 수 있으며 메서드를 동적으로 호출할 수 있습니다.
프로젝트가 거의 마무리되어 드디어 블로그에 글을 쓸 시간이 생겼네요,
어셈블리별 메서드를 동적으로 호출하는 예를 만들어 보세요.
프로젝트 1(데모)에는 Test 클래스가 포함되어 있으며 getList 메서드는 Test 클래스에 작성되어 있습니다. 이 메서드에서 반환된 데이터는 수동으로 추가됩니다. 소스 코드는 다음과 같습니다.
프로젝트 1
시스템 사용;
System.Collections.Generic을 사용합니다.
System.Text 사용;
System.Data
네임스페이스 데모
사용
{
공개 수업 테스트
{
공개 DataTable getList(문자열 ID)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id"));
dt.Columns.Add(new DataColumn("이름"));
dt.Columns.Add(new DataColumn("sex"));
DataRow dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "장링";
dr["sex"] = "남성";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "이혜";
dr["sex"] = "여성";
dt.Rows.Add(dr);
dt를 반환;
}
}
}
프로젝트 2(DemoXml)에는 Test 클래스가 포함되어 있습니다. getList 메소드는 Test 클래스에 작성됩니다. 이 메소드에 의해 반환된 데이터는 데이터베이스에서 읽혀집니다. 소스 코드는 다음과 같습니다.
프로젝트 2
시스템 사용;
System.Collections.Generic을 사용합니다.
System.Text 사용;
System.Data 사용;
System.Data.SqlClient 사용;
System.Xml 사용;
네임스페이스 DemoXml
{
공개 수업 테스트
{
개인 SqlConnection cn;
공개 DataTable getList(문자열 ID)
{
노력하다
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = 새로운 SqlCommand();
SqlDataAdapter da = 새로운 SqlDataAdapter();
cmd.CommandText = "id로 au_id, 이름으로 au_lname, 작성자의 성별로 au_fname을 선택하세요.";
cmd.CommandType = CommandType.Text;
cmd.연결 = CN;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
dt를 반환;
}
잡기 (예외예외)
{
throw new ApplicationException("예외가 발생했습니다: "+ex.Message+ex.StackTrace);
}
마지막으로
{
cn.닫기();
CN = 널;
}
}
}
}
프로젝트 3(WebDemo)에서는 지정된 어셈블리에서 getList 메서드를 동적으로 사용하여 DataTable을 반환하고 그리드 뷰를 사용하여 반환된 데이터를 표시하는 방법을 보여줍니다.
데모에 전화하세요
시스템 사용;
System.Data 사용;
System.Configuration 사용;
System.Web 사용;
System.Web.Security 사용;
System.Web.UI 사용;
System.Web.UI.WebControls 사용;
System.Web.UI.WebControls.WebParts 사용;
System.Web.UI.HtmlControls 사용;
System.Reflection 사용;
공개 부분 클래스 _Default: System.Web.UI.Page
{
protected void Page_Load(개체 전송자, EventArgs e)
{
if (!IsPostBack)
{
DropBind();
}
}
데이터 초기화는 web.config 파일에서 구성할 수 있습니다. #region 데이터 초기화는 web.config 파일에서 구성할 수 있습니다.
공공 무효 DropBind()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("이름"));
dt.Columns.Add(new DataColumn("파일 경로"));
DataRow dr = dt.NewRow();
dr["name"] = "자신의 데이터 로드";
dr["filepath"] = Server.MapPath(@"FilesDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "xml 데이터 로드";
dr["filepath"] = Server.MapPath(@"FilesDemoXml.dll");
dt.Rows.Add(dr);
this.DropDownList1.DataSource = dt;
this.DropDownList1.DataTextField = "이름";
this.DropDownList1.DataValueField = "파일 경로";
this.DropDownList1.DataBind();
}
#endregion
protected void DropDownList1_SelectedIndexChanged(개체 전송자, EventArgs e)
{
노력하다
{
//지정된 dll 파일을 읽고 선택합니다.
string strPath = (DropDownList로 보낸 사람).SelectedValue.Trim();
string NameSpace = this.DropDownList1.SelectedIndex == 0 ? "Demo.Test": "DemoXml.Test";
//지정된 어셈블리를 메모리에 로드
어셈블리 어셈블리 = Assembly.LoadFrom(strPath);
//어셈블리에서 지정된 개체를 반환합니다. 모든 개체가 반환되면 GetTypes()를 사용하여 Type 개체의 배열을 반환합니다.
유형 T = 어셈블리.GetType(NameSpace);
//메소드 정보 반환(공용 메소드)
MethodInfo mi = T.GetMethod("getList");
//이전 유형을 기반으로 객체 생성
객체 o = Activator.CreateInstance(T);
//매개변수
object[] par = 새 object[] { "E01" };
//MethodInfo 개체의 Invoke 메서드를 통해 이 메서드를 동적으로 호출합니다. 매개 변수 o는 인스턴스 메서드가 호출될 때 인스턴스가 필요하기 때문입니다.
DataTable dt = (DataTable)mi.Invoke(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
잡기 (예외예외)
{
//doException
}
}
}
Assembly.LoadFrom 메서드에서 반환된 Assembly 개체의 메타데이터를 읽을 수 있습니다. 그중 GetType은 지정된 어셈블리를 나타내는 데 사용되는 유형 개체를 반환합니다. 어셈블리의 모든 유형을 읽고 GetTypes를 사용하면 유형 개체의 배열이 반환됩니다.
반환 방법 정보(공개 방법)
MethodInfo mi = T.GetMethod("getList");
이전 유형을 기반으로 개체 만들기
객체 o = Activator.CreateInstance(T);
매개변수
object[] par = 새 object[] { "E01" };
이 메서드는 MethodInfo 개체의 Invoke 메서드를 통해 동적으로 호출됩니다. o 매개 변수는 인스턴스 메서드가 호출될 때 인스턴스가 있어야 하기 때문입니다.
DataTable dt = (DataTable)mi.Invoke(o, par);
호출에서 반환된 데이터가 목록에 표시됩니다.
샘플 다운로드: