技术文档 >ASP.NET >

用户控件的晋级使用方法(BindingFlags )

作者:shenjk 2008-8-20 11:13:19 浏览/评论:42/0

    在平常的开发中,我们经常会使用到用户控件(.ascx),这个玩意给我带来了不少的方便,但是在使用中页面也会发现一些问题;特别是在.net2.0下。

     比如:我们建立一个用户控件:

Header.ascx:<div>玉米烙 http://www.shenjk.com <%=Index%></div>

Header.ascx.csusing System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

public partial class Controls_Header : System.Web.UI.UserControl
{
    private int m_Index;
    public int Index {
        get { return m_Index; }
        set { m_Index = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

     代码很简单,使用中也不会出什么错,给属性Index赋值也很简单。但是问题就出现在给Index赋值上,

建立一个母模板:

   其中添加一个控件:<aspx:Header ID="Header1" runat="server"/>

再建立一个内容页,index.aspx

在该内容页需要对母模办页里的Header1控件的Index属性赋值,到这里很多朋友都人家很简单呀使用下面的代码就可以的:

示例错误代码        Controls_Header li = (Controls_Header)this.Master.FindControl("Header1");
        if (li != null)
        {
            li.Index = "2";
        }

上面代码在Debug下偶尔不会报错,但发布的时候绝对报错,找不到Controls_Header类型,完蛋了,岂不是不能给用户控件赋值了??

慢慢来:

示例正确代码Control ctrl = this.Master.FindControl("Header1");
        ctrl.GetType().InvokeMember("Index", BindingFlags.SetProperty, null, ctrl, new object[] { 2 });

上面代码也很简单,就不多说了,关键是 InvokeMember 这个方法我们在做反射的时候经常用到,下面b把BindingFlags详细说一下

 成员名称说明
CreateInstance指定“反射”应该创建指定类型的实例。调用与给定参数匹配的构造函数。忽略提供的成员名。如果未指定查找类型,将应用 (Instance |Public)。调用类型初始值设定项是不可能的。 
DeclaredOnly指定只应考虑在所提供类型的层次结构级别上声明的成员。不考虑继承成员。 
Default不指定绑定标志。 
ExactBinding指定提供参数的类型必须与对应形参的类型完全匹配。如果调用方提供一个非空 Binder 对象,则“反射”将引发异常,因为这意味着调用方正在提供的 BindToXXX 实现将选取适当的方法。 

“反射”建立通用类型系统的可访问规则模型。例如,如果调用方在相同的程序集内,则它不需要内部成员的特殊权限。否则,调用方需要 ReflectionPermission。这与保护成员、私有成员等成员的查找是一致的。

一般原则是,ChangeType 应只执行永远不会丢失数据的扩展强制。扩展强制的一个例子是将 32 位有符号整数值强制为 64 位有符号整数值。这与窄缩强制不同,后者可能丢失数据。窄缩强制的一个例子是将 64 位有符号整数强制为 32 位有符号整数。

默认联编程序忽略此标志,而自定义联编程序可以实现此标志的语义。

FlattenHierarchy指定应返回层次结构上的公共静态成员和受保护的静态成员。不返回继承类中的私有静态成员。静态成员包括字段、方法、事件和属性。不返回嵌套类型。 
GetField指定应返回指定字段的值。 
GetProperty指定应返回指定属性的值。 
IgnoreCase指定当绑定时不应考虑成员名的大小写。 
IgnoreReturn在 COM interop 中用于指定可以忽略成员的返回值。 
Instance指定实例成员将包括在搜索中。 
InvokeMethod指定要调用一个方法。这可能不是构造函数或类型初始值设定项。 
NonPublic指定非公共成员将包括在搜索中。 
OptionalParamBinding返回其参数计数与提供参数的数目匹配的成员集。此绑定标志用于所带参数具有默认值的方法和带变量参数 (varargs) 的方法。此标志应只与 Type.InvokeMember 一起使用。 

具有默认值的参数仅用在省略尾部参数的调用中。它们必须是最后的参数。

Public指定公共成员将包括在搜索中。 
PutDispProperty指定应调用 COM 对象的 PROPPUT 成员。PROPPUT 指定使用值的属性设置函数。如果属性同时具有 PROPPUTPROPPUTREF,而且需要区分调用哪一个,请使用 PutDispProperty。 
PutRefDispProperty指定应调用 COM 对象的 PROPPUTREF 成员。PROPPUTREF 指定使用引用而不是值的属性设置函数。如果属性同时具有 PROPPUTPROPPUTREF,而且需要区分调用哪一个,请使用 PutRefDispProperty。 
SetField指定应设置指定字段的值。 
SetProperty指定应设置指定属性的值。对于 COM 属性,指定此绑定标志与指定 PutDispPropertyPutRefDispProperty 是等效的。 
Static指定静态成员将包括在搜索中。 
SuppressChangeType未实现。 

我来说几句:

主题:
作者:
内容: