C#自定义Attribute举例!(转自:http://archive.cnblogs.com/a/471288/)

本文介绍了一个使用 C# 枚举和自定义特性的示例,展示了如何定义枚举类型并使用特性来标记类,进一步通过反射获取这些特性进行条件判断。

usingSystem;

namespaceConsoleApplication1
{
//定义枚举
[System.Flags()]
publicenumAccountsE
{
Saveings=0x0001,
Checking=0x0002,
Brokerage=0x0004
}
//自定义特性
[System.AttributeUsage(AttributeTargets.Class)]
publicclassAccountsAttribute:Attribute
{
publicAccountsEaccounts;
publicAccountsAttribute(AccountsEaccounts)
{
this.accounts=accounts;
}
}
[ConsoleApplication1.Accounts(AccountsE.Saveings)]
classChildAccount{}
[ConsoleApplication1.Accounts(AccountsE.Saveings|AccountsE.Checking|AccountsE.Brokerage)]
classAdultAccount{}

classClass1
{
[STAThread]
staticvoidMain(string[]args)
{
CanWriteCheck(newChildAccount());
CanWriteCheck(newAdultAccount());
CanWriteCheck(newClass1());
}
publicstaticvoidCanWriteCheck(objectobj)
{
//构造AccountsAttribute实例
AccountsAttributechecking=newAccountsAttribute(AccountsE.Checking);
//通过Attribute.GetCustomAttribute的静态方法来得到指定的特性的实例,然后就可以读取实例的属性了,用此来判断
//依据
AttributevalidAccounts=Attribute.GetCustomAttribute(obj.GetType(),typeof(AccountsAttribute),false);
if(validAccounts!=null)
{
AccountsAttributetmpAccounts=validAccountsasAccountsAttribute;
if((checking.accounts&tmpAccounts.accounts)==checking.accounts)
{
Console.WriteLine("{0}typescanwritechecks.",obj.GetType());
}
else
{
Console.WriteLine("{0}typecannotwritechecks.",obj.GetType());
}
}
else
{
Console.WriteLine("{0}typecannotwritechecks.",obj.GetType());
}

}
}
}

<think>好的,我需要解决用户关于JSF中使用xmlns引入碎片文件的方法,以及composite和facelets命名空间的区别的问题。首先,我得回顾一下用户之前的问题和我的回答,确保现在的内容保持一致。用户之前的问题是关于如何通过xmlns引入碎片文件,我给出了示例和步骤,包括模板定义、引入方式、参数化碎片以及目录结构。现在用户进一步询问具体的引入方法和两个命名空间的区别,并且引用了站内的几个引用内容,需要结合这些引用进行分析。首先,xmlns引入碎片文件的方法。根据之前的回答,用户需要了解如何通过自定义命名空间来引用碎片文件。例如,使用xmlns:my="http://xmlns.jcp.org/jsf/composite/templates/fragments"这样的命名空间声明,然后在页面中使用<my:组件名/>来调用。需要详细说明步骤,包括文件存放位置、命名空间URI的构成,以及如何传递参数。接下来,关于composite和facelets命名空间的区别。引用中提到了composite:interface和composite:implementation,这属于复合组件的定义。而facelets的命名空间通常用于模板和组合,比如ui:composition和ui:include。需要区分两者的用途:composite用于创建可重用的复合组件,而facelets用于页面模板和片段组合。同时,注意不同命名空间URI的版本变化,比如旧版可能使用java.sun.com,而新版使用xmlns.jcp.org。用户提供的引用[1]、[3]提到cc.attrs访问属性,这是复合组件的特性。引用[2]展示了不同的命名空间声明,包括composite和facelets。引用[4]提到了cc.parent的使用,说明复合组件间的嵌套关系。需要将这些信息整合到回答中,解释两者的区别。另外,用户可能混淆了复合组件和碎片文件(facelets模板)的概念。需要明确:复合组件使用http://java.sun.com/jsf/composite命名空间,通常放在resources目录下,而facelets模板使用http://xmlns.jcp.org/jsf/facelets,用于组合多个页面片段。最后,确保回答结构清晰,分点说明引入方法和命名空间区别,正确引用提供的引用内容,并生成相关问题。同时注意系统指令中的LaTeX格式,但这里可能用不上,但需要检查是否有数学表达式需要处理,不过当前问题似乎不涉及数学内容。</think>### 一、JSF通过xmlns引入碎片文件的方法 #### 1. **定义碎片文件** 碎片文件需存放在以下目录之一: - `/WEB-INF/` 目录下的模板文件(如`templates/`) - `/resources/` 目录下的复合组件(如`resources/mycomponents/`) **示例:复合组件定义** 在`resources/mycomponents/header.xhtml`中定义: ```xhtml <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:cc="http://xmlns.jcp.org/jsf/composite"> <cc:interface> <cc:attribute name="title" required="true"/> </cc:interface> <cc:implementation> <h1 style="color: blue">#{cc.attrs.title}</h1> </cc:implementation> </html> ``` #### 2. **通过xmlns引入** 在页面中使用自定义命名空间声明: ```xhtml <html xmlns:my="http://xmlns.jcp.org/jsf/composite/mycomponents"> <my:header title="欢迎页面"/> </html> ``` - **命名空间URI规则**:`http://xmlns.jcp.org/jsf/composite/[资源目录路径]` 例如,`mycomponents`目录对应URI的`/mycomponents`部分[^2] #### 3. **参数传递** 通过`cc:attribute`定义参数,调用时通过属性传递: ```xhtml <my:footer year="2023" company="TechCorp"/> ``` 在组件内部通过`#{cc.attrs.attributeName}`访问参数[^1] --- ### 二、`composite`与`facelets`命名空间的区别 #### 1. **功能定位** | 命名空间 | 用途 | |--------------------------------------|----------------------------------------------------------------------| | `http://java.sun.com/jsf/composite` | 定义复合组件(Composite Component),包含`<cc:interface>`和`<cc:implementation>`[^3] | | `http://java.sun.com/jsf/facelets` | 使用Facelets模板标签(如`<ui:composition>`、`<ui:include>`)组合页面片段[^2] | #### 2. **典型使用场景** - **Composite命名空间** 创建可复用的带参数组件,例如表单控件、业务模块等。支持嵌套组件(通过`cc.parent`访问父组件属性[^4]) - **Facelets命名空间** 实现页面模板化,例如: ```xhtml <ui:composition template="/WEB-INF/templates/base.xhtml"> <ui:define name="content">主内容区域</ui:define> </ui:composition> ``` #### 3. **URI版本差异** - **旧版JSF**:使用`java.sun.com`域名(如`http://java.sun.com/jsf/composite`) - **JSF 2.2+**:推荐使用`xmlns.jcp.org`(如`http://xmlns.jcp.org/jsf/composite`) #### 4. **代码结构对比 **Composite组件示例**: ```xhtml <cc:interface> <cc:attribute name="data" type="java.util.List"/> </cc:interface> <cc:implementation> <h:dataTable value="#{cc.attrs.data}" var="item"> <!-- 表格内容 --> </h:dataTable> </cc:implementation> ``` **Facelets模板示例**: ```xhtml <ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <ui:insert name="header">默认头部</ui:insert> <ui:insert name="body"/> </ui:composition> ``` --- ### 三、核心差异总结 | 特性 | Composite命名空间 | Facelets命名空间 | |---------------------|--------------------------------------------|-------------------------------------| | **组件类型** | 可参数化的独立组件 | 页面片段组合与模板继承 | | **参数传递** | 支持属性级参数(`cc:attribute`) | 通过`ui:param`传递上下文参数 | | **嵌套关系** | 支持多层嵌套(`cc.parent`访问父组件[^4]) | 通过`ui:include`包含外部片段 | | **典型标签** | `<cc:interface>`, `<cc:implementation>` | `<ui:composition>`, `<ui:insert>` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值