使用反射依导航路径调用对象成员方法,或返回对象子、孙属性或字段成员

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请包含本声明

///作者: CSDN网名alias88,邮件:alias88@163.com,QQ:63343 ,欢迎加我

/// <summary>

///依导航路径调用对象成员方法,或返回对象其子、孙属性或字段成员.

///例子:

///获得表的第二列的名称

///GetMember(dataTable1.GetType(),"Columns.Item.Name",dataTable1,1)

///执行表的Select方法,并返回可能的DataRow数组

///GetMember(dataTable1.GetType(),"Select",dataTable1,"客户编号 = 'C0001')

///取活动表单的名称,静态成员不需传入obj

///GetMember(typeof("System.Windows.Forms.Form"),"ActiveForm.Name",null,null)

/// </summary>

/// <param name="type">获得此类型的子孙成员</param>

/// <param name="memberPath">子孙成员的路径描述,以点作为分隔符</param>

/// <param name="obj">如果成员是静态类型,则为null</param>

/// <param name="args">参数,注意此参数只能为memberPath最后一个成员使用</param>

/// <returns></returns>

public static object GetMember(Type type,string memberPath,object obj,object[] args)

{

if (memberPath==null || memberPath.Trim ()=="")

throw new ArgumentException ("缺少必需的参数","memberPath");

if (type==null )

throw new ArgumentException ("缺少必需的参数","type");

Type _objectType=type;

object _object=obj;

object[] paras=null;

string[] strMember=memberPath.Split ('.');

for (int i=0; i<strMember.Length ;i++)

{

string MemberName=strMember[i];

if (i>=strMember.Length-1 )

paras=args;

_object = _objectType.InvokeMember(MemberName,

BindingFlags.Public | BindingFlags.NonPublic |

BindingFlags.Instance | BindingFlags.Static |

BindingFlags.GetField | BindingFlags.GetProperty |

BindingFlags.InvokeMethod | BindingFlags.IgnoreCase ,

Type.DefaultBinder, _object, paras);

if (_object!=null)

_objectType=_object.GetType ();

else if (i<strMember.Length-1)

throw new ArgumentNullException(MemberName);

}

return _object;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有