如何获取类或属性的自定义特性

如何获取类或属性的自定义特性,第1张

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获取该类中类别的属性名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9320520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存