C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 動的DLLでコレクションクラスのADDの制御方法


(過去ログ 138 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■81396 / inTopicNo.1)  動的DLLでコレクションクラスのADDの制御方法
  
□投稿者/ yamamoto (1回)-(2016/09/15(Thu) 20:59:38)

分類:[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の処理
        }
    }
}

引用返信 編集キー/
■81397 / inTopicNo.2)  Re[1]: 動的DLLでコレクションクラスのADDの制御方法
□投稿者/ yamamoto (2回)-(2016/09/15(Thu) 21:37:21)
ご迷惑をおかけしました
自己解決出来ました。

mi_mono.Invoke(OthereIns, prms);

以下に修正

mi_mono.Invoke(pr_mono.GetValue(OthereIns, null), prms);

以上です。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -