`
阿尔萨斯
  • 浏览: 4208424 次
社区版块
存档分类
最新评论

c# 反射的用法

 
阅读更多
在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,
今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.
首先我们建立一个类库,将它生成为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组件

    C# 通过反射调用com组件,封装了几个简单的方法方便使用反射调用com。 var obj=new ComObj("excel.application"); obj["Visible"]=true; obj. InvokeMethod("Application.Workbooks.Open", fileName);

    c#反射例子的用法(

    反射例子的运用 取当前正在运行的程序集中的类型,类型为“命名空间.类型

    c#反射调用方法示例

    反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象; 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法获取此类型支持的方法列表;该方法的两种形式: MethodInfo [] GetMethods() ...

    01:详解C#中的反射.pdf

    ●使用 C# typeof 运算符。 Type t = typeof(string); ●使用对象GetType()方法。 string s = "grayworm"; Type t = s.GetType(); ●还可以调用Type类的静态方法GetType()。 Type t = Type.GetType("System....

    C# 反射 Type Assembly类

    (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和...

    C# 反射实例

    这是一个关于C#的发射使用的一个实例,获取属性,方法,赋值等操作。

    C#2.0中通过反射功能给类赋值

    介绍的很详细,通过他学习反射的用法。可以作为教程学习~~

    C#反射示例

    C#反射的示例,里面全面的介绍了反射的使用方法。值得推荐给大家。

    详解C# 反射(Reflection)

    C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建...

    C#实现反射调用动态加载的DLL文件中的方法

    1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。 3. 反射主要应用与...

    程序集反射工具

    使用 .NET Reflector,你可以浏览程序集的类和方法,可以分析由这些类和方法生成的 Microsoft 中间语言 (MSIL),并且可以反编译这些类和方法并查看 C# 或 Visual Basic .NET 中的等价类和方法。

    .NET/C#利用反射调用含ref或out参数的方法示例代码

    使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性、方法等。在.NET中的反射可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中...

    C# 加载Dll 使用反射 调用对应的方法公开方法,私有方法,泛型方法

    学习反射.调用反射内的方法 C# 加载Dll 使用反射 调用对应的方法公开方法,私有方法,泛型方法

    c# 中 反射的用法

    在网上查找了不少的资料,可以说大同小异,概念...今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西, 在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟就不用看了.

    c#使用dynamic类型优化反射的方法

    什么是dynamic类型? 微软给出的官方文档中这样解释:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查。 改为在运行时解析这些操作。...在大多数情况下,dynamic 类型与 object 类型的行为类似。...

    c#动态加载dll技术(不用反射)

    1.不使用反射机制就可以动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2.应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到该技术。 3.主要应用与...

    C# 使用反射来实现对象的深度复制方法

    下面小编就为大家带来一篇C# 使用反射来实现对象的深度复制方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    细细品味C#(抽象接口委托反射).pdf

    在方法或属性声明中使用 abstract 修饰符以指示此方法或属性 不包含实现。 【抽象方法】具有以下特性:  抽象方法是隐式的 virtual 方法。  只允许在抽象类中使用抽象方法声明。  因为抽象方法声明不提供...

    封装的Excle反射类

    * 功能描述:C#通过反射读写Excel的功能,适用于所有的Excel版本,不需要引用Com组件 * 扩展功能:原始版本为一个俄罗斯人的作品,找不到出处了,我调整了部分内容,并增加了一些方法。 * 增加的方法有,获取...

    c# 反射学习

    c# 反射学习 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用...

Global site tag (gtag.js) - Google Analytics