贝网博客

我的分类
流水记事
源码下载
Asp.net
其它
数据库
Javascript
.Net技术
我的相册
友情链接
博客园
CSDN博客
Start0
最新回复
嗷嗷的cCC
fasdfasdf
[:..
lz这个东西好厉害,我..
哈哈,好照片
不错,以前一直用黄色..
终于找到支持ff的修正..
终于找到支持ff的修正..
新鲜性
看看,试试,好不好使。
分类 =》.Net技术
C#中反射调用重载方法及重载的索引器
发表于: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()来判断是否合适的方法
}

发表评论
名称(*):
邮箱:
正文:

©2008 Beinet.cn 版权所有