首页 新闻 会员 周边

c# Attribute 反射问题

0
悬赏园豆:5 [已解决问题] 解决于 2012-09-11 16:55

public abstract class TotalTestAttribute
{

[Length(50)]

[Cluom]
public string name { get; set; }
public string sex { get; set; }
}

上面只是我随便写的一个属性例子

我想我的model 想个 Attribute,然后通过反正这个model,获取这个Attribute,然后判断有这个Attribute怎么,没有又怎么样

但是如果有多个不相同 Attribute  作用的同一个属性,循环判断显然不行,想到子类都继承至一个父类,然后父类做好所有的的功能,每个子类只实现父类部分功能,但是怎么反射会这个父类呢?

或者说这个想法就不行,望高手指点?

其实我的真正的想法就是写个方法,传进一个model后,就自动生成sql语句,但是这个model我想添加一些标记,比如类名是代表表名,但是也可以自定 重命名的 Attribute  ,比如属性名可以加 表示这个属性是否是表的列名,重命名列,这列的长度和类型能, 我想到了mvc中Attribute  ,一个属性上有很多的Attribute  ,他们的后面机制是怎么处理的?

夜星冷的主页 夜星冷 | 初学一级 | 园豆:71
提问于:2012-09-11 14:50
< >
分享
最佳答案
0

多个Attribute,当然就循环处理了,只是循环里的的实现模式有技巧,比如职责链、命令模式,这样就可以把逻辑理的很清楚。

取父类类型可以通过 GetBaseType 来取。

鉴于你要实现的完整功能,你可以直接使用EF的Code First模式,如果要知道最佳的实现方式,你可以把EF的源代码反编译出来查看下。

收获园豆:3
Launcher | 高人七级 |园豆:45045 | 2012-09-11 15:07

谢谢,我多 想想,很多项目不用ef,直接写sql,insert 都一样,还要拼接麻烦,就想写个方法,仍一个molde后,自动构造sql 方便点

夜星冷 | 园豆:71 (初学一级) | 2012-09-11 15:12

@夜星冷: 老大,你能不能把我的建议看完啊,你看看我最前面关于循环处理的推荐实现啊。稍微用点设计模式就能把你提到的 foreach if else 给去掉,让代码的可维护性更好。

Launcher | 园豆:45045 (高人七级) | 2012-09-11 15:15

@Launcher: 

设计模式 平时看是看过,没怎么用就忘记饿了。我回家去补补。。。

水品太差了,有时候都好意思来这里提问,谢谢。。。。

夜星冷 | 园豆:71 (初学一级) | 2012-09-11 15:23
其他回答(3)
0

循环判断 怎么不行?

向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-11 15:05

我有好几个这个标记,

foreach (Attribute attr in 
          Attribute.GetCustomAttributes(mInfo)) {
         
          if (attr.GetType() == typeof(AnimalTypeAttribute))
{}
else if(attr.GetType() == typeof(AnimalTypeAttribute2))
{}
....
}
难道这样没更好的办法了吗 ?
支持(0) 反对(0) 夜星冷 | 园豆:71 (初学一级) | 2012-09-11 15:08

@夜星冷: 

Type t=typeof(TotalTestAttribute);

t.getProperty("name ").GetCustomAttributes();

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-11 15:17
-1
GetCustomAttributes(Type,bool) 可以指定类型获取自定义属性,如果获取父类可以先获取父类型。
循环没有问题,反射之后缓存起来不要每次都反射就行。
收获园豆:1
君之蘭 | 园豆:230 (菜鸟二级) | 2012-09-11 15:15

yoxi

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-09-11 15:47
0

为什么要那么多的特性呢?按照你所说两个类就行了,在类里面添加属性,获取属性的值就行了。如果连字段大小你都要用特性那你的特性的有多少,而且这么多你代码写的也麻烦,还影响性能。

收获园豆:1
程序员的人生 | 园豆:235 (菜鸟二级) | 2012-09-11 15:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册