惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 老姜

SQL Server 2008 收缩日志 【原创】自定义Membership,KSPMembership发布,支持多数据库(mysql/oracle/sqlserver) 日志与工厂模式(二) 日志与工厂模式(一) The timeout period elapsed prior to obtaining a connection from the pool.数据库连接池满的原因 Asp.net mvc 入门介绍(公司内部讲座学习资料) SERV-U 防火墙设置 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败 的解决方法 ASP.NET MVC 多语言解决方案 C#(ASP.NET)DateTime日期类型格式化显示 (转载) DLinq 仅支持SQL SERVER ,不支持Mysql/Oracle 从SQL SERVER 2000到SQL SERVER 2005 视图中存在 ORDER BY 语句的完全解决方案 一个中型OA系统的架构过程(二) Enterprise Library for .NET Framework 2.0 掌握 ASP.NET 之路:自定义实体类简介(转载-ORM、泛型等) 转载:一个中型OA系统的架构过程(一) WebServices层次划分 SQL SERVER 2000 存储过程不支持数组的解决方法! 通过日志来恢复到你要的时点
反射复习(Reflection)
老姜 · 2009-04-08 · via 博客园 - 老姜

C#的反射是一个比较基础的知识,尤其是在2.0以及后续的版本上,反射的应用更是常见,也成为了许多其他技术/思想的实现基础,尤其是在设计模式中,像策略模式,工厂模式等。下面是一个非常简单的反射例子。

首先定义一个 Person 类

namespace Reflection {
    class Person {
        public string Name { get; set; }
        public int Age { get; set; }
        public Sex sex { get; set; }
        public Person(string name,int age,Sex s) {
            Name = name;
            Age = age;
            sex = s;
        }
        public void SayHello() {
            Console.WriteLine("Hello, I am {0}",Name);
            Console.ReadKey();
        }
    }
    enum Sex {
        male,
        female
    }
}

然后要动态的创建这个Person类的实例,注意,这次我们并不是 new ,而是通过反射来创建这个 Person 类的实例。

创建这个实例这可以用下面这句,因为Person的构造是必须传入参数的,所以要传递初始值。

Type t = typeof(Person);

Object obj = Activator.CreateInstance(t, new Object[] { "Jerry", 30, Sex.male });

这样就创建了一个 Person 类的实例。

下一步可以动态的来修改 Name 属性的值:

PropertyInfo p_name = obj.GetType().GetProperty("Name");
if (p_name != null && p_name.CanRead) {
    p_name.SetValue(obj, "Jonathan", null);
}

最后,可以调用创建实例的方法:

MethodInfo m = obj.GetType().GetMethod("SayHello");
m.Invoke(obj,null);

完整代码如下:

namespace Reflection {
    class Program {
        static void Main(string[] args) {
            Type t = typeof(Person);
            Object obj = Activator.CreateInstance(t, new Object[] { "Jerry", 30, Sex.male });
            PropertyInfo p_name = obj.GetType().GetProperty("Name");
            if (p_name != null && p_name.CanRead) {
                p_name.SetValue(obj, "Jonathan", null);
            }
            MethodInfo m = obj.GetType().GetMethod("SayHello");
            m.Invoke(obj,null);
        }
    }
}

这里只是简单的复习了一下反射的基础知识。