C# 为什么要用反射,什么情况必须使用反射。

guanzijuan123 2013-09-06 11:09:53
DLL内容都了解的话,直接引用DLL不就好了吗,为什么还要反射。
DLL里面的内容什么都不知道的话,就算反射的话,也不知道里面的方法是干什么的啊,和直接引用DLL没区别啊。

有的说工厂模式动态加载DLL时需要用到反射
如果我不用工厂模式,也不动态加载是不是就不需要使用了那。
...全文
27174 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
孙大诚_SunRobin 2016-05-26
  • 打赏
  • 举报
回复
解耦。解耦。解耦。解耦。解耦。解耦。解耦。
bluedoctor 2016-05-26
  • 打赏
  • 举报
回复
你提供接口别人提供这个接口的实现,但是不给你源码不给你方法说明,那么这个时候你就只有用反射调用它的实现,以接口形式来使用了。常见的IOC就是这样组织人民这样干的东西。
System.IO.Ports 2016-05-26
  • 打赏
  • 举报
回复
反射很有用,有些情况使用反射可以少写很多行代码
  • 打赏
  • 举报
回复
标个记号回头来看 顺便跟lz说一下,反射到你要用的时候写不出来,很抓
yangyugw 2016-04-26
  • 打赏
  • 举报
回复
     private void showHexstr(string hexstr)
        {

           
            MainBody mainBody = Parser.Protocol2Entity(YM.Common.alg.HexToByte(hexstr));
            ShowObj(mainBody.Area);
            this.HexTextBox.AppendText(hexstr);
            this.HexTextBox.AppendText("\r");
            HexTextBox.ScrollToEnd();
        }
        public void ShowObj(object obj)
        {
            if (obj == null) return ;
            System.Reflection.PropertyInfo[] ps = obj.GetType().GetProperties();

            var displayNames = obj.GetType().GetCustomAttributes(typeof(DisplayNameAttribute), true);
            string displayName;
            if (displayNames.Length > 0)
                displayName = (displayNames.GetValue(0) as DisplayNameAttribute).DisplayName;
            else displayName = obj.GetType().Name;

            this.ObjTextBox.AppendText(displayName);
            this.ObjTextBox.AppendText("\r");

            foreach (System.Reflection.PropertyInfo p in ps)
            {
                string value = "";
                var o = p.GetValue(obj, null);
                if (o != null)
                {
                    string tmp = o.ToString();

                    displayNames = p.GetCustomAttributes(typeof(DisplayNameAttribute),true);
                   
                    if (displayNames.Length > 0)
                        displayName = (displayNames.GetValue(0) as DisplayNameAttribute).DisplayName;
                    else displayName = p.Name;
                    value = displayName + ":" + value + tmp + " ";
                }
                this.ObjTextBox.AppendText(value);
                this.ObjTextBox.AppendText("\r");
            }
            this.ObjTextBox.AppendText("\r");
            this.ObjTextBox.AppendText("\r");
        }
yangyugw 2016-04-26
  • 打赏
  • 举报
回复
数据库持久层,不用反射么
SoulRed 2016-04-22
  • 打赏
  • 举报
回复
大家对于24000小时之前的帖子这么热情啊
lkf181 2016-04-22
  • 打赏
  • 举报
回复
为了偷懒,调用别人编译好的代码,明白了吧?
junqiang0916 2016-04-22
  • 打赏
  • 举报
回复
看你的应用场景,如果你的程序不需要很多不确定的接口,没有必要使用 比如你的程序要支持多种身份证读卡器,很多目前用不到可能以后加,这样就可以用了
小伙真帅 2016-04-22
  • 打赏
  • 举报
回复
回楼上,那你的意思就是,像那些IOC,AOP框架,都是在装B了? 任何东西存在即是合理,你可以不用,但是你不能否认他存在的意义。
火星大能猫 2016-04-22
  • 打赏
  • 举报
回复
就是动态调用的时候 比如你连接多个品牌的摄像头 每个摄像头都是一个你自己封装的dll 都有open close方法 那就要反射了 一般项目确实用不到.
jhdxhj 2016-04-22
  • 打赏
  • 举报
回复
反射的性能很低,其实很多时候就是装B的时候用反射
大鱼> 2016-04-22
  • 打赏
  • 举报
回复
网友给的一个例子,个人觉得还不错 比如有一个猫类: public class Cat { public int Age { get; set; } public string Name { get; set; } //假设它的属性还有很多很多 } 现在问题是:我NEW一个猫叫"小猫1",我想复制这一个对象,“小猫2”,那该怎么处理呢? 像下面这样吗: Cat c1 = new Cat() { Age=20,Name="小猫1" }; Cat c2=c1; 那这样肯定是错的。因为c1和c2都引用的是同一个对象“小猫1”,那我现在想复制一个跟小猫1一模一样的对象怎么处理呢?这里就用到了反射: 方法: protected void Page_Load(object sender, EventArgs e) { Cat c1 = new Cat() { Age=20,Name="小猫" }; Type type = typeof(Cat); Cat c2 = new Cat(); foreach (System.Reflection.PropertyInfo info in type.GetProperties()) { info.SetValue(c2, info.GetValue(c1, null), null); } Label1.Text = c2.Name; Label2.Text = c2.Age.ToString(); }
技道两进 2016-04-22
  • 打赏
  • 举报
回复
比如你做一个平台,里面可以挂很多插件!这些插件都是程序执行时动态加载的,这时,就用到了反射。
面宅 2016-04-04
  • 打赏
  • 举报
回复
引用 13 楼 sp1234 的回复:
一个人认为程序开发过程中的“设计”跟自己无关、都是领导的事情,那么他就一辈子没有这方面需求。 反之,如果你把口号付诸于实践,那么你必须在一万行代码中总有那么十几行代码明确地使用到反射的。
装B
  • 打赏
  • 举报
回复 2
楼主问的问题很入门,大神们都理解不了,回答也是太深了. 楼主的问题就好比, 我要算1+1=2 不需要类,甚至不需要写一个函数,直接输出1+1 不就完了吗? 任何一门技术存在即合理,楼主要是想知道什么时候用什么时候不用只有在你用过若干次之后才能深刻了解这门技术到底有什么用,而且到时候你自然理解了,就好像刚开始学编程的人,问面向对象有什么用,我不用面向对象也可能写出来啊.
公寓城传说 2016-03-01
  • 打赏
  • 举报
回复
一般的构架,都有用到反射,便于扩展, dll和类名可以自己传入
  • 打赏
  • 举报
回复
心理问题造成了不成熟的争议,阻止了真正的技术讨论。 工厂模式它本身就是“反射、注入”概念的设计超级,它就是体现了通过配置或者传输而反射出来一些未知类型的对象实例(这些实例实现了统一的业务父类或者父接口)。 问题是你的方式——姿势,不像是虚心学习反射应用的哦?!
  • 打赏
  • 举报
回复
这里,我认为你的问题不是关于“反射”的技术问题,而是心理上和逻辑上故意的问题。
  • 打赏
  • 举报
回复
引用 16 楼 dth886 的回复:
[quote=引用 13 楼 sp1234 的回复:] 一个人认为程序开发过程中的“设计”跟自己无关、都是领导的事情,那么他就一辈子没有这方面需求。 反之,如果你把口号付诸于实践,那么你必须在一万行代码中总有那么十几行代码明确地使用到反射的。
我也不懂,求科普啊,大神!为啥要用C#反射?[/quote] 你不是在问题中表明了嘛!人家告诉你“有的说工厂模式动态加载DLL时需要用到反射”,你直接来一句“如果我不用工厂模式......”,这不就是典型的故意抬杠嘛! 就像有的家长跟子女说“好好学习,将来有个好前途”,孩子说“如果我不想有个好前途,只想玩儿,那么......”,这不就是抬杠嘛。这时候你还让人再给你“科普”?传统一点的家庭,直接就不给你饭吃。
加载更多回复(37)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧