|
分類:[C#]
開発環境 VS2005
使用言語 C#
いつも参考にさせて頂いています。
動的に参照するDLLクラスにはコレクションクラスが宣言されています。
動的に参照するDLLと動的に呼び出す画面は別々のプロジェクトです。
動的に呼び出す画面にてコレクションクラスのメンバに対してAddを
行いたいですがエラーとなります。と言うか記述方法が分かりません。
※動的に呼び出す画面のBの部分です。
どなたかご教授を願いないでしょうか?
▼動的に参照する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
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);
MessageBox.Show((string)GetOyaname);
#endregion Cの処理
}
}
}
|