首页 新闻 搜索 专区 学院

.NET利用反射获取类中的方法的不解问题

0
悬赏园豆:5 [已解决问题] 解决于 2012-12-19 14:29

想在一个类中获取另一个类的私有方法,我是利用反射来做的,其中有些许疑问想不明白,想请教各位:

 

public class TypeParse
    {
        private int Add()
        {
            return 2 + 1;
        }
        public void Adds()
        {
        }

        public int Num { get; set; }
        public string Name { get; set; }
}

public class person
{
        /// <summary>
        /// 反射获取方法属性
        /// </summary>
        public static void GetMethod()
        {
            TypeParse objects = new TypeParse();
            System.Reflection.MethodInfo mInfo = typeof(TypeParse).GetMethod("Add", System.Reflection.BindingFlags.NonPublic 
| System.Reflection.BindingFlags.Instance); } }

我这样写能正常获取到类中的私有方法,但是,我把

System.Reflection.MethodInfo mInfo = typeof(TypeParse).GetMethod("Add", 
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
修改成:
System.Reflection.MethodInfo mInfo = typeof(TypeParse).GetMethod("Add", 
System.Reflection.BindingFlags.NonPublic);
这样我就没有办法获取到类中的私有方法了,这到底是为什么呢?我指定了位屏蔽的搜索标志位NonPublic,
为什么我不指定位屏蔽的搜索标志位Instance就检索不到类中的方法呢?这到底是为什么,请各位不吝赐教,谢谢!

ljcheibao的主页 ljcheibao | 初学一级 | 园豆:132
提问于:2012-11-26 13:52
< >
分享
最佳答案
0

需要指定 BindingFlags.Instance 来获取实例方法,你的Add方法是实例方法,如果没有这个标记位,那么只会搜索静态方法,所以没有找到你要的方法。

收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-11-26 14:01

我试过了啊,我把私有方法改成静态的,还是搜索不到,也必须要指定System.Reflection.BindingFlags.Static才能搜索到静态方法

ljcheibao | 园豆:132 (初学一级) | 2012-11-27 11:15

@ljcheibao: 我的意思是,你如果一个都不指定,直接用.GetMethod("Add"),那么相当于默认指定了:

BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance

如果你要手动指定,那么就得指定全了.去看下Type.GetMethod方法的代码就知道了。
水牛刀刀 | 园豆:6350 (大侠五级) | 2012-11-27 13:40

@水牛刀刀: 

TypeParse objects = new TypeParse();
System.Reflection.MethodInfo mInfo = typeof(TypeParse).GetMethod("Add", System.Reflection.BindingFlags.NonPublic);

我这样不是已经指定查找的是非公用的Add方法了吗,为什么搜索不到,还必须要加上BindingFlags.Instance才搜索得到,求解,谢谢!

ljcheibao | 园豆:132 (初学一级) | 2012-12-03 15:26
其他回答(1)
0
Add 这个方法是 私有的实例方法(
System.Reflection.BindingFlags.Instance
chenping2008 | 园豆:9836 (大侠五级) | 2012-11-26 14:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册