您的位置:首页 > 编程语言 > C#

C# 反射笔记

2015-10-20 14:36 621 查看
.Net FrameWork中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息。

在程序集中,包含模块(Module),模块包含类型,类型包含成员,提供反射,我们可以查看到一个程序集的路径,命名空间,类。我们还可以对其进行操作

可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样

反射机制通道有下面一些用途

->使用Assembly定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

->使用Module发现以下信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其它特定的非全局方法。

->使用ConstructorInfo发现以下信息:构造函数的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。

->使用MethodInfo发现以下信息:方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。

->使用FieldInfo发现以下信息:字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等;并获取或设置字段值。

->使用EventInfo发现以下信息:事件名称 、事件处理程序数据类型、自定义特性、声明类型和反射类型等;并添加或移除事件处理程序。

->使用PropertyInfo发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

->使用ParameterInfo发现惟下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

->当您在一个应用程序域的仅反射上下文中作时,请使用CustomAttributeData来发现有在自定义特性的信息。通过使用CustomAttributeData,您不必创建特性的实例就可以检查他们。

interface ILiveable
{
string Name { get; set; }
int Age { get; set; }
char Sex { get; set; }

void SayHello(string str);
void SayHello();
void SayHello(string str, int age);
}

class Person : ILiveable
{
public string Name { get; set; }

public int Age { get; set; }

public char Sex { get; set; }

public void SayHello(string str)
{
Console.WriteLine("你好,我是" + Name + " ,Sex" + str);
}
public void SayHello()
{
Console.WriteLine("你好,我是" + Name);
}
public void SayHello(string str, int age)
{
Console.WriteLine("你好,我是" + Name + " ,Sex:" + str + ",Age:" + age);
}
}
///方式--------------------------------------
static void Main(string[] args)
{
//不使用Person来调用这个类型中的方法与属性
//对象的GetType();
Person p = new Person();
Type t = p.GetType();
// Type t = typeof(Person);
//GetMethod获取方法
//使用Type数组设置要获取重载方法的相应参数方法。
MethodInfo m = t.GetMethod("SayHello", new Type[] { typeof(string),typeof(int) });
//Getproperty获取属性
PropertyInfo pif = t.GetProperty("Name");
//创建Person对象的实例
object o = Activator.CreateInstance(t);

//这个类型的对象成员没有办法赋值
//给属性赋值
pif.SetValue(o, "小小");
//调用方法,(对象名,参数[]);
m.Invoke(o, new object[] { "男",20 });
Console.ReadKey();
}
///-----------------------------------------------
static void Main(string[] args)
{
Type t = typeof(Person);
//将t实例化为其接口类型
ILiveable i = Activator.CreateInstance(t) as ILiveable;
if (i != null)
{
//直接对i进行赋值与调用
i.Name = "MisLiu";
i.SayHello("男", 23);
}
Console.ReadKey();
}
///将上面的Person生成dll,加载dll程序集,使用反射获取属性及方法,并调用
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFile(Path.GetFullPath("Person.dll"));
Type t = asm.GetType("命名空间.类名");
object o = Activator.CreateInstance(t);
PropertyInfo p = t.GetProperty("Name");
MethodInfo m = t.GetMethod("SayHello");
p.SetValue(o, "LiLi");
m.Invoke(o, null);
Console.ReadKey();
}
点击链接,查看原文
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: