首页 新闻 会员 周边 捐助

C# 的反射

0
悬赏园豆:50 [已解决问题] 解决于 2013-01-09 17:20
比如我建立了一个admin公共类文件,里面有proc1函数,如何使用反射Assembly,当我输入admin的时候就回提示出proc1这个函数。
如果可以的话,给一个例子我吧!surging2@qq.com,反射主要用在什么地方呀?
徐滔的主页 徐滔 | 初学一级 | 园豆:3
提问于:2012-12-03 15:42
< >
分享
最佳答案
1
   System.Reflection.Assembly ass;
   Type type ;
   object obj;
    ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");
   type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
 System.Reflection.MethodInfo method = type.GetMethods();//方法的名称

这样就可以得到了,你可以用admin

  type = ass.GetType("Webtest.ReflectTest");替换掉这个字符串
收获园豆:50
az235 | 大侠五级 |园豆:8483 | 2012-12-03 15:50
(@"d:\TestReflect.dll"); 这里可以不写绝对路径吗? 反射主要用在什么地方呀?
徐滔 | 园豆:3 (初学一级) | 2012-12-03 17:13

@徐滔: 当然可以不写绝对路径,可以放在bin目录下或项目的某个文件夹下面,反正只要找到就可以

反射的用处嘛,典型的用法是工厂方法

az235 | 园豆:8483 (大侠五级) | 2012-12-03 23:44
其他回答(2)
1
        /// <summary>
        /// 反射加载窗体信息
        /// </summary>
        /// <param name="filePath">插件DLL路经</param>
        /// <param name="plugin">插件描述</param>
        /// <param name="loadedPlugins">记录已经加载出来的窗口</param>
        /// <param name="loadBars">存储已经加载出来的工具栏</param>
        /// <param name="stripItem">工具菜单</param>
        /// <param name="toolStrip">主菜单</param>
        /// <returns>bool</returns>
        public static bool RegiestPluginAssemblyForms(string filePath, Plugin plugin, List<string> loadedPlugins,
                                                      Dictionary<string, ToolStrip> loadBars, ToolStripItem stripItem,
                                                      ToolStrip toolStrip)
        {
            Assembly ab = Assembly.LoadFrom(filePath + plugin.NameSpace + "." + plugin.Exends);
            Type[] types = ab.GetTypes();
            foreach (Type t in types)
            {
                if (t.GetInterface("IPluginForms") != null && t.Name == plugin.ClassName)
                {
                    //判断窗体是否已打开
                    if (loadedPlugins.Contains(t.FullName))
                        return false;
                    //根据反射 显示窗体信息
                    var obj = (IPluginForms)ab.CreateInstance(t.FullName);
                    if (obj != null)
                    {
                        obj.ShowDlog();
                        //如果窗体显示成功
                        loadedPlugins.Add(t.FullName);
                        //显示工具栏
                        ToolStrip child = obj.MenuInfo;
                        toolStrip.Visible = true;
                        toolStrip.AllowMerge = true;
                        //合并菜单管理
                        ToolStripManager.RevertMerge(toolStrip);
                        ToolStripManager.Merge(child, toolStrip);
                        //存储已经加载显示出来的工具栏
                        if (!loadBars.ContainsKey(stripItem.Text))
                            loadBars.Add(stripItem.Text, child);
                    }
                }
            }
            return true;
        }
在 水 一 方 | 园豆:1097 (小虾三级) | 2012-12-04 14:16
1

关于代码,楼上的应该已经满足要求了.

反射就是动态的加载DLL,我之前用过一个精算的程序里面

是等待用户写算法以后,把算汉编译成dll然后再反射到程序里面,

不过反射一但把DLL动态引用到程序集里面,就不能再删除了,所以这一点要注意.

只会造轮子 | 园豆:2274 (老鸟四级) | 2012-12-05 10:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册