日期:2014-05-20  浏览次数:20821 次

关于反射的问题:Type.InvokeMember如何获取在父类的属性
我的页面有两个控件  
TextBox1
DropDownList1

我写了一个函数返回对页面对象的特定属性值

object   GetMyValue(string   strControlServerID,string   strPropertyName)
{
        object   obj=this.FindControl(strControlServerID);
        Type   t=obj.GetType();
        return   t.InvokeMember   (   strPropertyName,BindingFlags.DeclaredOnly   |   BindingFlags.Public   |   BindingFlags.NonPublic|   BindingFlags.Instance   |   BindingFlags.GetProperty   |   BindingFlags.GetField|   BindingFlags.NonPublic
,   null   ,   obj   ,   null   );
}
调用的时候
GetMyValue( "TextBox1 ", "Text ");//成功,返回TextBox1.Text的值
GetMyValue( "DropDownList1 ", "SelectedValue ");//失败!提示DropDownList没有SelectedValue属性
我查了一下MSDN,发现   Text属性是   TextBox这个类的,而SelectedValue属性是   DropDownList类的父类(System.Web.UI.WebControls.ListControl)的属性,虽然我们在使用的时候用的是   DropDownList.SelectedIndex,但是通过   Type.InvokeMember却不能实现,请教各位,该如何解决这个问题呢


另外,我查了在VB中可以用CallByName来实现查找指定控件的指定属性值,在C#中却没有这个方法,我在VB中写了一个类来调用这个方法
        Public   Shared   Function   CallGetPropertyByName(ByVal   ObjectRef   As   Object,   ByVal   ProcName   As   String,   ByVal   ParamArray   Args   As   Object())   As   Object
                Return   CallByName(ObjectRef,   ProcName,   CallType.Get,   Args)
        End   Function


想在C#中使用,却出现这样的提示
Service   Unavailable


------解决方案--------------------
找到办法了
如果只是属性的话,用下面的方法
object GetMyValue(string strControlServerID,string strPropertyName)
{
object obj=this.FindControl(strControlServerID);
Type t=obj.GetType();
return t.GetProperty ( strPropertyName ).GetValue ( obj,null);
}


------解决方案--------------------
如果你加上BindingFlags .DeclaredOnly是有错误的..

BindingFlags .DeclaredOnly过滤掉了从父类继承来的属性和方法..