在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,
今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
首先我们建立一个类库,将它生成为HelloWorld.dll,
usingSystem;
namespaceWebtest
...{
publicinterfaceinterface1
...{
intadd();
}
publicclassReflectTest:interface1
...{
publicStringWrite;
privateStringWritec;
publicStringWritea
...{
get
...{
returnWrite;
}
set
...{
Write=value;
}
}
privateStringWriteb
...{
get
...{
returnWritec;
}
set
...{
Writec=value;
}
}
publicReflectTest()
...{
this.Write="Write";
this.Writec="Writec";
}
publicReflectTest(stringstr1,stringstr2)
...{
this.Write=str1;
this.Writec=str2;
}
publicstringWriteString(strings,intb)
...{
return"欢迎您,"+s+"---"+b;;
}
publicstaticstringWriteName(strings)
...{
return"欢迎您光临,"+s;
}
publicstringWriteNoPara()
...{
return"您使用的是无参数方法";
}
privatestringWritePrivate()
...{
return"私有类型的方法";
}
publicintadd()
...{
return5;
}
}
}
然后,建立再建立一个项目引入该HelloWorld.dll,
usingSystem;
usingSystem.Threading;
usingSystem.Reflection;
classTest
...{
delegatestringTestDelegate(stringvalue,intvalue1);
staticvoidMain()
...{
//Assemblyt=Assembly.LoadFrom("HelloWorld.dll");与下面相同的效果
Assemblyt=Assembly.Load("HelloWorld");
//**********************************************************************
foreach(Typeaaaint.GetTypes())
...{
//Console.Write(aaa.Name);//显示该dll下所有的类
}
//**********************************************************************
Module[]modules=t.GetModules();
foreach(Modulemoduleinmodules)
...{
//Console.WriteLine("modulename:"+module.Name);//显示模块的名字本例为"HelloWorld.dll"
}
//**********************************************************************
Typea=typeof(Webtest.ReflectTest);//得到具体的类的类型,和下面一个效果
//Typea=t.GetType("Webtest.ReflectTest");//
//Console.Write(a.Name);
//**********************************************************************
string[]bb=...{"aaaa","bbbbb"};
objectobj=Activator.CreateInstance(a,bb);//创建该类的实例,后面的bb为有参构造函数的参数
//objectobj=t.CreateInstance("Webtest.ReflectTest");//与上面方法相同
//**********************************************************************
MethodInfo[]miArr=a.GetMethods();
foreach(MethodInfomi0inmiArr)
...{
//Console.Write(mi0.Name);//显示所有的共有方法
}
//**********************************************************************
MethodInfomi=a.GetMethod("WriteString");//显示具体的方法
object[]aa=...{"使用的是带有参数的非静态方法",2};
strings=(string)mi.Invoke(obj,aa);//带参数方法的调用
MethodInfomi1=a.GetMethod("WriteName");
String[]aa1=...{"使用的是静态方法"};
strings1=(string)mi1.Invoke(null,aa1);//静态方法的调用
MethodInfomi2=a.GetMethod("WriteNoPara");
strings2=(string)mi2.Invoke(obj,null);//不带参数的方法调用
MethodInfomi3=a.GetMethod("WritePrivate",BindingFlags.Instance|BindingFlags.NonPublic);
strings3=(string)mi3.Invoke(obj,null);//私有类型方法调用
//Console.Write(s3);
//**********************************************************************
PropertyInfo[]piArr=a.GetProperties(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);
foreach(PropertyInfopiinpiArr)
...{
//Console.Write(pi.Name);//显示所有的方法
}
//**********************************************************************
PropertyInfopi1=a.GetProperty("Writea");
//pi1.SetValue(obj,"Writea",null);
//Console.Write(pi1.GetValue(obj,null));
PropertyInfopi2=a.GetProperty("Writeb",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);
pi2.SetValue(obj,"Writeb",null);
//Console.Write(pi2.GetValue(obj,null));
FieldInfofi1=a.GetField("Write");
//Console.Write(fi1.GetValue(obj));
//**********************************************************************
ConstructorInfo[]ci1=a.GetConstructors();
foreach(ConstructorInfociinci1)
...{
//Console.Write(ci.ToString());//获得构造函数的形式
}
ConstructorInfoasCI=a.GetConstructor(newType[]...{typeof(string),typeof(string)});
//Console.Write(asCI.ToString());
//**********************************************************************
Webtest.interface1obj1=(Webtest.interface1)t.CreateInstance("Webtest.ReflectTest");
Webtest.ReflectTestobj2=(Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");
//Console.Write(obj1.add());典型的工厂模式
//**********************************************************************
foreach(Typettint.GetTypes())
...{
if(tt.GetInterface("interface1")!=null)
...{
Webtest.interface1obj3=(Webtest.interface1)Activator.CreateInstance(a);
//Console.Write(obj3.add());
}
}
//**********************************************************************
TestDelegatemethod=(TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),obj,"WriteString");
//动态创建委托的简单例子
//Console.Write(method("str1",2));
//**********************************************************************
ConstructorInfoasCI1=a.GetConstructor(newType[0]);
Webtest.ReflectTestobj5=(Webtest.ReflectTest)asCI1.Invoke(null);
//通过无参构造函数实例化的方法
//Console.Write(obj5.Writea);
ConstructorInfoasCI2=a.GetConstructor(newType[]...{typeof(string),typeof(string)});
//通过有参构造函数实例化的方法
Webtest.ReflectTestobj6=(Webtest.ReflectTest)asCI2.Invoke(bb);
Console.Write(obj6.Writea);
//**********************************************************************
Console.Read();
}
}
在这里我把我们常用的方法,属性,等全部整理了出来,大家不要嫌弃乱,静下心来,自己按照我的分隔一部分一部分的来,保证你对反射的学习,会事半功倍.当然有关于其方法我会继续补充,想了这么些就先写下来吧.
分享到:
相关推荐
C# 通过反射调用com组件,封装了几个简单的方法方便使用反射调用com。 var obj=new ComObj("excel.application"); obj["Visible"]=true; obj. InvokeMethod("Application.Workbooks.Open", fileName);
反射例子的运用 取当前正在运行的程序集中的类型,类型为“命名空间.类型
反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象; 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法获取此类型支持的方法列表;该方法的两种形式: MethodInfo [] GetMethods() ...
●使用 C# typeof 运算符。 Type t = typeof(string); ●使用对象GetType()方法。 string s = "grayworm"; Type t = s.GetType(); ●还可以调用Type类的静态方法GetType()。 Type t = Type.GetType("System....
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和...
这是一个关于C#的发射使用的一个实例,获取属性,方法,赋值等操作。
介绍的很详细,通过他学习反射的用法。可以作为教程学习~~
C#反射的示例,里面全面的介绍了反射的使用方法。值得推荐给大家。
C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建...
1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。 3. 反射主要应用与...
使用 .NET Reflector,你可以浏览程序集的类和方法,可以分析由这些类和方法生成的 Microsoft 中间语言 (MSIL),并且可以反编译这些类和方法并查看 C# 或 Visual Basic .NET 中的等价类和方法。
使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性、方法等。在.NET中的反射可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中...
学习反射.调用反射内的方法 C# 加载Dll 使用反射 调用对应的方法公开方法,私有方法,泛型方法
在网上查找了不少的资料,可以说大同小异,概念...今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西, 在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
什么是dynamic类型? 微软给出的官方文档中这样解释:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查。 改为在运行时解析这些操作。...在大多数情况下,dynamic 类型与 object 类型的行为类似。...
1.不使用反射机制就可以动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2.应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到该技术。 3.主要应用与...
下面小编就为大家带来一篇C# 使用反射来实现对象的深度复制方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在方法或属性声明中使用 abstract 修饰符以指示此方法或属性 不包含实现。 【抽象方法】具有以下特性: 抽象方法是隐式的 virtual 方法。 只允许在抽象类中使用抽象方法声明。 因为抽象方法声明不提供...
* 功能描述:C#通过反射读写Excel的功能,适用于所有的Excel版本,不需要引用Com组件 * 扩展功能:原始版本为一个俄罗斯人的作品,找不到出处了,我调整了部分内容,并增加了一些方法。 * 增加的方法有,获取...
c# 反射学习 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用...