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 ,他们的后面机制是怎么处理的?
多个Attribute,当然就循环处理了,只是循环里的的实现模式有技巧,比如职责链、命令模式,这样就可以把逻辑理的很清楚。
取父类类型可以通过 GetBaseType 来取。
鉴于你要实现的完整功能,你可以直接使用EF的Code First模式,如果要知道最佳的实现方式,你可以把EF的源代码反编译出来查看下。
谢谢,我多 想想,很多项目不用ef,直接写sql,insert 都一样,还要拼接麻烦,就想写个方法,仍一个molde后,自动构造sql 方便点
@夜星冷: 老大,你能不能把我的建议看完啊,你看看我最前面关于循环处理的推荐实现啊。稍微用点设计模式就能把你提到的 foreach if else 给去掉,让代码的可维护性更好。
@Launcher:
设计模式 平时看是看过,没怎么用就忘记饿了。我回家去补补。。。
水品太差了,有时候都好意思来这里提问,谢谢。。。。
循环判断 怎么不行?
我有好几个这个标记,
foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo)) { if (attr.GetType() == typeof(AnimalTypeAttribute))
{}
else if(attr.GetType() == typeof(AnimalTypeAttribute2))
{}
....
}
难道这样没更好的办法了吗 ?
@夜星冷:
Type t=typeof(TotalTestAttribute);
t.getProperty("name ").GetCustomAttributes();
GetCustomAttributes(Type,bool) 可以指定类型获取自定义属性,如果获取父类可以先获取父类型。
循环没有问题,反射之后缓存起来不要每次都反射就行。
yoxi
为什么要那么多的特性呢?按照你所说两个类就行了,在类里面添加属性,获取属性的值就行了。如果连字段大小你都要用特性那你的特性的有多少,而且这么多你代码写的也麻烦,还影响性能。