1 定义一个以Attribute结尾的特性类, 特性类继承自SystemAttribute, 如下所示
[AttributeUsage(AttributeTargetsProperty, AllowMultiple=false)]
public class PrimaryKeyAttribute : SystemAttribute
{
其中AttributeTargets是一个枚举的值, 可以是: Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate
2 在需要使用的地方使用PrimaryKey自定义特性标签, 如下所示
[PrimaryKey(Column = "CustomerID", IsIdentity=false)]
public int ID
{
3 为了获取自定义特性的信息, 需要反射的方式获取其数据, 首先我们定义一个类来存储这些信息, 如下所示
public class PrimaryKeyModel
{
private readonly PropertyInfo propertyInfo;//外键的属性字段信息
private readonly PrimaryKeyAttribute primaryKeyAtt;//外键的特性信息
public static PrimaryKeyModel GetPrimaryKey(Type type)
{
PropertyInfo[] properties = typeGetProperties();
foreach (PropertyInfo p in properties)
{
object[] keys = pGetCustomAttributes(typeof(PrimaryKeyAttribute), true);
if (keysLength == 1)
{
return new PrimaryKeyModel(p, keys[0] as PrimaryKeyAttribute);
}
}
return null;
}
4 在Customer类中获取其特性的信息代码如下
string strReturn = stringEmpty;
//Get PrimaryKey Name
PrimaryKeyModel attribute= PrimaryKeyModelGetPrimaryKey(thisGetType());
if(attribute != null)
{
strReturn += stringFormat("PrimaryKey Name:{0} IsIdentity:{1} Column:{2}\r\n",
attributePropertyName, attributePrimaryKeyAttIsIdentity, attributePrimaryKeyAttColumn);
}
把窗体本身或者控件传入这个类(或者做为参数传给这个类的方法),看你的需要了,比如说你在form1里创建的这个类叫myclass,把这个mycalss的构造方法改成
public class myclass{
form1 frm;
public myclass(form1 frm)
{
thisfrm=frm;
}
}
这样你在form1中创建这个myclass的时候就可以是
myclass mc=new myclass(this);
当然也可以直接传窗体或者控件给类中的方法,比如mycalss中有
public void msg(EditText txt)
或者
public void msg(form1 frm)
其它方法也很多,看你需要了。
获取property list:
unsigned int count = 0;
objc_property_t properties = class_copyPropertyList([self class], &count);
获取property名:
const char propertyName = property_getName(properties[index])
使用KVC获取property值:
id propertyValue = [self valueForKey:name];
你好,可以通过java的反射获取。代码如下:
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
try {
//TDict是实体对象
Class<TDict> c = TDictclass;
//获取对象中所有的方法
Method[] methods = cgetMethods();
//进行循环
for (Method method : methods) {
//判断方法上是否存在Column这个注解
if (methodisAnnotationPresent(Columnclass)) {
//methodinvoke(bus, new Object[]{});
Column col = methodgetAnnotation(Columnclass);
//Systemoutprintln(col);
//下面是取值
Systemoutprint("方法名称:"+methodgetName());
Systemoutprint("\tname---"+colname());
Systemoutprint("\tnullable---"+colnullable());
Systemoutprintln("\tlength---"+collength());
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
需要引用
import javalangreflectInvocationTargetException;
import javalangreflectMethod;
import javaxpersistenceColumn;
测试结果:
方法名称:getId name---id nullable---false length---255
方法名称:getDictDescribe name---dict_describe nullable---true length---50
方法名称:getDictType name---dict_type nullable---true length---20
方法名称:getDictSort name---dict_sort nullable---true length---255
方法名称:getDictRemark name---dict_remark nullable---true length---50
方法名称:getDictCtime name---dict_ctime nullable---true length---50
望采纳,
以上就是关于如何获取类或属性的自定义特性全部的内容,包括:如何获取类或属性的自定义特性、C#一个普通的类,怎么获取窗体里控件的属性、如何使用runtime获取该类中类别的属性名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)