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

///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请包含本声明
///作者: CSDN网名alias88,邮件: [email protected] ,QQ:63343 ,欢迎加我

__

///

 1<summary>
 2
 3///  依导航路径调用对象成员方法,或返回对象其子、孙属性或字段成员. 
 4
 5///  例子  : 
 6
 7///  获得表的第二列的名称 
 8
 9///  GetMember(dataTable1.GetType(),"Columns.Item.Name",dataTable1,1) 
10
11///  执行表的  Select方法,并返回可能的DataRow数组 
12
13///  GetMember(dataTable1.GetType(),"Select",dataTable1,"客户编号 = 'C0001') 
14
15///  取活动表单的名称  ,静态成员不需传入obj 
16
17///  GetMember(typeof("System.Windows.Forms.Form"),"ActiveForm.Name",null,null) 
18
19///  </summary>

///

1<param name="type"/>

获得此类型的子孙成员

///

1<param name="memberPath"/>

子孙成员的路径描述,以点作为分隔符

///

1<param name="obj"/>

如果成员是静态类型,则为null

///

1<param name="args"/>

参数,注意此参数只能为memberPath最后一个成员使用

///

1<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

 1<strmember.length (i="" ;i++)="" if="" membername="strMember[i];" string="" {="">=strMember.Length-1 ) 
 2
 3paras=args; 
 4
 5_object = _objectType.InvokeMember(MemberName, 
 6
 7BindingFlags.Public | BindingFlags.NonPublic | 
 8
 9BindingFlags.Instance | BindingFlags.Static | 
10
11BindingFlags.GetField |  BindingFlags.GetProperty | 
12
13BindingFlags.InvokeMethod | BindingFlags.IgnoreCase , 
14
15Type.DefaultBinder,  _object, paras); 
16
17if  (_object!=  null  ) 
18
19_objectType=_object.GetType (); 
20
21else  if  (i&lt;strMember.Length-1) 
22
23throw  new  ArgumentNullException(MemberName); 
24
25} 
26
27return  _object; 
28
29}</strmember.length>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus