|
分類:[C#]
開発環境 VS2005 使用言語 C#
いつも参考にさせて頂いています。
動的に参照するDLLクラスにはコレクションクラスが宣言されています。 動的に参照するDLLと動的に呼び出す画面は別々のプロジェクトです。 動的に呼び出す画面にてコレクションクラスのメンバに対してAddを 行ったデータを表示を行いたいですのですが、記述方法が分かりません。
※動的に呼び出す画面のCの部分が分かりません。
どなたかご教授を願いないでしょうか?
▼動的に参照するDLL using System; using System.Collections; using System.Collections.Generic; using System.Text;
namespace Othere { public class Othere { public Othere() { }
private string name = string.Empty;
/// <summary> /// 名前 /// </summary> public string Name { get { return name; } set { name = value; } }
private Motimono motimono = new Motimono();
/// <summary> /// アイテムコレクション /// </summary> public Motimono Motimono { get { return motimono; } }
/// <summary> /// メッセージを表示 /// </summary> /// <param name="moji"></param> /// <returns></returns> public string GetMsg(string moji) { string retmoji = string.Empty;
retmoji = name;
return retmoji;
} }
/// <summary> /// アイテムコレクションクラス /// </summary> public class Motimono : IEnumerable { private List<Item> items = new List<Item>();
public void Add(Item item) { items.Add(item); }
public Item this[int index] { get { return this.items[index]; } set { this.items[index] = value; } }
public IEnumerator GetEnumerator() { throw new NotImplementedException(); } }
/// <summary> /// アイテムクラス /// </summary> public class Item { public Item() { }
private string itemName = "";
public string ItemName { get { return itemName; } set { itemName = value; } } } }
▼以下 動的に呼び出す画面 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection;
namespace YobidasiMoto { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { /* ▼参照設定を行った場合 //@ Othere.Othere o = new Othere.Othere(); //A o.Name = "yamada";
//B Item i = new Item(); i.ItemName = "pc"; o.Motimono.Add(i);
//C o.Motimono[0].ItemName を取得する方法が不明 MessageBox.Show(o.Name + "持ち物=" + o.Motimono[0].ItemName); ▲参照設定を行った場合 */
#region @の処理 string dllName = @"C:\app\Othere.dll"; if (!System.IO.File.Exists(dllName)) { MessageBox.Show("DLL存在エラー"); return ; }
Assembly asm = Assembly.LoadFrom(dllName);
//Othere型宣言 Type OthereType = asm.GetType("Othere.Othere");
object OthereIns = Activator.CreateInstance(OthereType); #endregion @の処理
#region Aの処理 PropertyInfo pr_oyaName = null; pr_oyaName = OthereType.GetProperty("Name"); pr_oyaName.SetValue(OthereIns, "yamamoto", null); #endregion Aの処理
#region Bの処理 //Item型宣言 Type ItemType = asm.GetType("Othere.Item"); object ItemIns = Activator.CreateInstance(ItemType);
//Itemを格納 PropertyInfo pr_itemName = null; pr_itemName = ItemType.GetProperty("ItemName"); pr_itemName.SetValue(ItemIns, "pc", null);
//持ち物プロパティ PropertyInfo pr_mono = null; pr_mono = OthereType.GetProperty("Motimono");
//Addメソッド Type MotimonoType = asm.GetType("Othere.Motimono"); MethodInfo mi_mono = MotimonoType.GetMethod("Add", new Type[] { ItemType });
object[] prms = new object[] { ItemIns }; mi_mono.Invoke(OthereIns, prms);
if (pr_mono == null) { MessageBox.Show("pr_monoエラー"); } else { } #endregion Bの処理
#region Cの処理 object GetOyaname = pr_oyaName.GetValue(OthereIns, null); #region 以下方法が分からない //o.Motimono[0].ItemName #endregion 以下方法が分からない
MessageBox.Show((string)GetOyaname); #endregion Cの処理 } } }
|