すべての .net アセンブリには、コードに加えて追加のメタデータが含まれています。メタデータには、バージョン番号、参照されているアセンブリなどのアセンブリ自体に関する情報と、そのメソッド、プロパティ、フィールドなどのあらゆる種類の情報が含まれます。 .net リフレクションを使用すると、この情報を実行時に読み取ることができ、メソッドを動的に呼び出すことができます。
プロジェクトもほぼ終わり、ようやくブログを書く時間ができました。
アセンブリ固有のメソッドを動的に呼び出す例を作成します。
プロジェクト 1 (デモ) には Test クラスが含まれており、getList メソッドが Test クラスに記述されており、このメソッドによって返されるデータは手動で追加されます。ソースコードは次のとおりです。
プロジェクト1
システムを使用する;
System.Collections.Generic を使用します。
System.Text を使用します。
System.Data
名前空間のデモ
を使用します。
{
パブリッククラステスト
{
public DataTable getList(文字列 ID)
{
DataTable dt = 新しい 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["名前"] = "張玲";
dr["性別"] = "男性";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["id"] = "zl";
dr["name"] = "李思";
dr["性別"] = "女性";
dt.Rows.Add(dr);
dt を返します。
}
}
プロジェクト
2 (DemoXml) には Test クラスが含まれており、このメソッドによって返されるデータはデータベースから読み取られます。ソースコードは次のとおりです。
プロジェクト2
システムを使用する;
System.Collections.Generic を使用します。
System.Text を使用します。
System.Data を使用します。
System.Data.SqlClient を使用します。
System.Xml を使用します。
名前空間 DemoXml
{
パブリッククラステスト
{
プライベート SqlConnection cn;
public DataTable getList(文字列 ID)
{
試す
{
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["pubs"]);
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da = 新しい SqlDataAdapter();
cmd.CommandText = "著者からの ID として au_id、名前として au_lname、性別として au_fname を選択します";
cmd.CommandType = コマンドタイプ.テキスト;
cmd.Connection = cn;
da.SelectCommand = cmd;
DataTable dt = 新しい DataTable();
da.Fill(dt);
dt を返します。
}
catch (例外例)
{
throw new ApplicationException("例外が発生しました: "+ex.Message+ex.StackTrace);
}
ついに
{
cn.Close();
cn = null;
}
}
}
では、
指定されたアセンブリで 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)
{
ドロップバインド();
}
}
データの初期化は web.config ファイルで構成できます #region データの初期化は web.config ファイルで構成できます
パブリック void DropBind()
{
DataTable dt = 新しい DataTable();
dt.Columns.Add(new DataColumn("name"));
dt.Columns.Add(new DataColumn("ファイルパス"));
DataRow dr = dt.NewRow();
dr["name"] = "独自のデータをロード";
dr["ファイルパス"] = Server.MapPath(@"FilesDemo.dll");
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["name"] = "XML データをロード";
dr["ファイルパス"] = 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();
文字列 NameSpace = this.DropDownList1.SelectedIndex == 0 ? "Demo.Test" : "DemoXml.Test";
//指定されたアセンブリをメモリにロードします
アセンブリアセンブリ = Assembly.LoadFrom(strPath);
//アセンブリ内の指定されたオブジェクトを返します。すべてのオブジェクトが返された場合は、GetTypes() を使用して Type オブジェクトの配列を返します。
タイプ T = Assembly.GetType(NameSpace);
//メソッド情報を返す(パブリックメソッド)
MethodInfo mi = T.GetMethod("getList");
// 前のタイプに基づいてオブジェクトを作成します
オブジェクト o = Activator.CreateInstance(T);
//パラメータ
object[] par = new object[] { "E01" };
//MethodInfo オブジェクトの Invoke メソッドを通じてこのメソッドを動的に呼び出します。パラメータ o は、インスタンス メソッドが呼び出されるときにインスタンスが存在する必要があるためです。
DataTable dt = (DataTable)mi.Invoke(o, par);
this.GridView1.DataSource = dt;
this.GridView1.DataBind();
}
catch (例外例)
{
//doException
}
}
Assembly.LoadFrom メソッドによって返される Assembly オブジェクト内のメタデータを読み取ることができます
。
その中の GetType は、指定されたアセンブリを表すために使用される型オブジェクトを返します (アセンブリ内のすべての型を読み取り、GetTypes を使用すると、型オブジェクトの配列が返されます)。
メソッド情報を返す(パブリックメソッド)
MethodInfo mi = T.GetMethod("getList");
前のタイプに基づいてオブジェクトを作成する
オブジェクト o = Activator.CreateInstance(T);
パラメータ
object[] par = new object[] { "E01" };
このメソッドは、MethodInfo オブジェクトの Invoke メソッドを通じて動的に呼び出されます。これは、インスタンス メソッドが呼び出されるときにインスタンスが存在する必要があるためです。
DataTable dt = (DataTable)mi.Invoke(o, par);
呼び出しによって返されたデータがリストに表示されます。
サンプルのダウンロード: