贝网博客

我的分类
流水记事
源码下载
Asp.net
其它
数据库
Javascript
.Net技术
我的相册
友情链接
博客园
CSDN博客
Start0
最新回复
fasdfasdf
[:..
lz这个东西好厉害,我..
哈哈,好照片
不错,以前一直用黄色..
终于找到支持ff的修正..
终于找到支持ff的修正..
新鲜性
看看,试试,好不好使。
好东西一起学习[:img0..
.Net技术 日志列表    
本站一共有博客83条,当前显示26条
 发表于:2011-08-03 10:04:27
更新于:2011-11-18 10:24:57

假设有一个类定义如下:
public class aaa
{
    private string[] arr = new[] { "11", "22", "33", "44", "55" };
    public string this[int a, int b]
    {
        get { return arr[a] + arr[b]; }
        set { arr[a] = value; arr[b] = value; }
    }
    public string this[int a]
    {
        get { return arr[a]; }
        set { arr[a] = value; }
    }
    public string GetArr(int a)
    {
        return arr[a];
    }
}

这个类里定义了2个索引器,如果用il反编译器查看生成的dll,可以看到索引器实际上被编译成了方法,上面的代码编译后得到4个方法和2个属性:
get_Item : string(int32)
get_Item : string(int32,int32)
set_Item : void(int32,string)
set_Item : void(int32,int32,string)
Item:instance string(int32)
Item:instance string(int32,int32)

所以呢,对于索引器的反射调用,实际上就是对get_Item和set_Item方法的调用

对于未重载的方法GetArr,调用相对简单一些,代码如下:
aaa a = new aaa();
Type p = a.GetType();
MethodInfo m = p.GetMethod("GetArr", BindingFlags.Instance | BindingFlags.Public);
Console.Write(m.Invoke(a, new object[]{1}));// 输出22

但是对于重载方法,就要用到GetMethod方法的另一个带参数定义的重载了,如果用上面的方法调用,那么在GetMethod时,就会出现错误:发现不明确的匹配
这里用get_Item方法演示重载的反射调用:
aaa a = new aaa();
Type p = a.GetType();
// 调用索引器this[int a]的set方法
MethodInfo mset1 = p.GetMethod("set_Item", BindingFlags.Instance | BindingFlags.Public, null,
                                new[] { typeof(int), typeof(string) }, null);
mset1.Invoke(a, new object[] { 1, "abc" });
// 调用索引器this[int a, int b]的set方法
MethodInfo mset2 = p.GetMethod("set_Item", BindingFlags.Instance | BindingFlags.Public, null,
                                new[] { typeof(int), typeof(int), typeof(string) }, null);
mset2.Invoke(a, new object[] { 1, 3, "abc" });
// 调用索引器this[int a]的get方法
MethodInfo mget1 = p.GetMethod("get_Item", BindingFlags.Instance | BindingFlags.Public, null,
                                new[] { typeof(int) }, null);
Console.Write(mget1.Invoke(a, new object[] { 1 }));
// 调用索引器this[int a, int b]的get方法
MethodInfo mget2 = p.GetMethod("get_Item", BindingFlags.Instance | BindingFlags.Public, null,
                                new[] {typeof (int), typeof (int)}, null);
Console.Write(mget2.Invoke(a, new object[] {1, 3}));

当然,你也可以通过GetMethods方法来遍历所有方法,根据参数来匹配到合适的方法,如:
foreach (MethodInfo i in p.GetMethods(BindingFlags.Instance | BindingFlags.Public))
{
    // 这里根据方法名i.Name,和方法的参数集i.GetParameters()来判断是否合适的方法
}

 发表于:2010-12-24 09:03:22

因为项目要静态化,从而开发了这么一个静态页面抓取生成工具,功能:
1、支持GET、POST的参数配置,并支持3种参数类型,如:id=1,2,3  name=a,b,c 则会循环生成9个静态页面      
2、支持多网页配置,保存路径配置,保存路径可以根据参数设置,如:d:\{#id}\{#name}.htm,里面的变量会被上面的参数替换

这个程序也可以用来抓取其它站点的html,保存到自己的机器上
目前程序还在测试,等自己测试好了,再打包发上来吧


©2008 Beinet.cn 版权所有