C#如何调用成员的私有成员和私用方法?

s8848 2014-11-11 09:24:26
C#的类如何调用成员的私有成员和私有方法?有什么方法大家推荐下.
...全文
1136 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2014-11-13
  • 打赏
  • 举报
回复
对于解释型和半解释型语言,一般都支持反射访问类成员
s8848 2014-11-13
  • 打赏
  • 举报
回复
访问是肯定有必要的,当别人的类设计的不合理,人家也不同意修改,尤其是多个项目合作的时候,学习了
lxsxd 2014-11-12
  • 打赏
  • 举报
回复
您好,我是一个C#初学者。对于私有成员和私有方法相关的知识,也曾迷惑过。我的困惑有如下:1)不知私有成员和私有方法是什么?2)为什么要有私有成员和私有方法?3)私有成员和私有方法如何调用? 我也曾想过,成员和方法是私有的,我要访问又该如何访问?如果公有的成员和方法,不想让别人访问,又该如何做? 其实,这些问题都是我们在学习过程中必然会遇到的问题。最根本的原因是,我们还没有做什么项目,所以纯粹按照自己脑海里跳出来的思绪来想。一旦当我们做项目(哪怕很小的项目),只要面对未知的客户、用户,想到他们会怎么操作,会怎么做,我们如何避免用户从操作失误或恶意操作对软件的影响,那么理解这些私有的、公有的、继承的就容易多了。
csjtxy 2014-11-11
  • 打赏
  • 举报
回复
using System;
using System.Reflection;
//======================
public object CallNonPublicMethod(object instance, string methodName, object[] param)
        {
            Type type = instance.GetType();
            MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
            object result;
            try
            {
                result = method.Invoke(instance, param);
            }
            catch (TargetInvocationException ex)
            {
                throw ex.InnerException;
            }
            return result;
        }
/* c#里利用反射功能实现调用私有方法 */
exception92 2014-11-11
  • 打赏
  • 举报
回复
引用 2 楼 s8848 的回复:
可是现在想怎么办?
或者使用继承方式,比如:A类中定义一个受保护的属性

public class A
    {
        protected int a = 123;
    }
那么只有继承A的派生类 才能获取到a的值。

 public class B : A
    {
        public B()
        {
            int b = base.a;
        }
    }
宝_爸 2014-11-11
  • 打赏
  • 举报
回复
不推荐,但是如果一定要做的话,可以用反射。 参考 How to get the value of private field in C#? http://stackoverflow.com/questions/3303126/how-to-get-the-value-of-private-field-in-c
xdashewan 2014-11-11
  • 打赏
  • 举报
回复
1楼说的没错,私有成员可以公布get方法,私有方法既然标志了私有也就没必要公布了吧
bdmh 2014-11-11
  • 打赏
  • 举报
回复
s8848 2014-11-11
  • 打赏
  • 举报
回复
可是现在想怎么办?
exception92 2014-11-11
  • 打赏
  • 举报
回复
private成员与属性除了owner能调用,其它类不能调用。
  • 打赏
  • 举报
回复
这说明类设计得不合理,或者使用方法不当 使用反射去修改私有成员可能会出现你意想不到的问题(当成员之间相互影响时)
_小黑_ 2014-11-11
  • 打赏
  • 举报
回复

   1、得到私有字段的值:

public static T GetPrivateField<T>(this object instance, string fieldname)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    FieldInfo field = type.GetField(fieldname, flag);
    return (T)field.GetValue(instance);
}2、得到私有属性的值:

public static T GetPrivateProperty<T>(this object instance, string propertyname)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    PropertyInfo field = type.GetProperty(propertyname, flag);
    return (T)field.GetValue(instance, null);
}3、设置私有成员的值:

public static void SetPrivateField(this object instance, string fieldname, object value) 
{ 
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; 
    Type type = instance.GetType(); 
    FieldInfo field = type.GetField(fieldname, flag); 
    field.SetValue(instance, value); 
} 
4、设置私有属性的值: 
public static void SetPrivateProperty(this object instance, string propertyname, object value) 
{ 
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; 
    Type type = instance.GetType(); 
    PropertyInfo field = type.GetProperty(propertyname, flag); 
    field.SetValue(instance, value, null); 
} 
5、调用私有方法:

public static T CallPrivateMethod<T>(this object instance, string name, params object[] param)
{
    BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
    Type type = instance.GetType();
    MethodInfo method = type.GetMethod(name, flag);
    return (T)method.Invoke(instance, param);
}
  • 打赏
  • 举报
回复
都私有了你访问别人干嘛。。。错误的思想就应该及时纠正。。。。
於黾 2014-11-11
  • 打赏
  • 举报
回复
为什么一定要这样做? 既然定义成私有,就是不想公开 为什么还要在外部调用? 外部想要调用,定义成公有不好吗,为什么非要用偏门的方式
csbinchina 2014-11-11
  • 打赏
  • 举报
回复
引用 7 楼 csjtxy 的回复:
using System;
using System.Reflection;
//======================
public object CallNonPublicMethod(object instance, string methodName, object[] param)
        {
            Type type = instance.GetType();
            MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
            object result;
            try
            {
                result = method.Invoke(instance, param);
            }
            catch (TargetInvocationException ex)
            {
                throw ex.InnerException;
            }
            return result;
        }
/* c#里利用反射功能实现调用私有方法 */
看看

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧