抛弃 反射得到属性的名称,为何不可以?为什么微软就是不去实现!!!
2013-01-17 07:19
330 查看
问题描述:
自从有了ORM之类的需求,也就有了一个实质存在的棘手问题。
那就是,如何知道某个类型的的字段。
而最简单的需求就像下面这样:
我们先定义一个实体:
ok,我们最简单的需求就是需要像下面这样调用:
很可惜不行,因为编译器会报N个错误。。。。
我们知道,静态成员的调用是下面这样:
但是,当我们在同一个类中写两个相同的属性的名称是不可行的:
那么总结一下,为什么不能实现像我们上面所需要的那样呢。。。
既然当我们调用例如:
的时候,编译器已经给给我们剔除了静态字段和实例字段不可以重复。因此就不会产生冲突。
但是,还有一个问题,就是编译器不知道
我们上面那样调用到底是要获取SModel.Name的值还是 这个字段的名称 "Name".
我的想法是这样,可以增加一个关键字例如 :"@"或者"$"之类的
而这个关键字的作用是标识我们要取的时候:
这样我们需要的时候就可以像这样:
//多好的办法,但问题是.net 本身比较封闭,与此同时,其实我在想,要是C#编译器本身可以提供一些插件式的接口,例如上面的这个功能官方不给我们实现,我们自己实现的话,应该会非常不错的。但是很可惜。
事实是没有。。。回到现实。
大家任然在苦逼地纠结着。。。。去实现。。。
这里吐槽一下作为.net 程序员的辛苦。应该说.net 的开发,类库的强大,也给我们带来了不少方便,但是与此同时。
由于MS自身并没有提供对操作系统更加完整的封装,我们很累。。。
还有就是其实C#也可以操作硬件。为什么不可以,当然可以。C#也可以写驱动。。。
只是。。。
我们需要的是一个 编译器。
一个平台,一个支持。
对于C#写汇编有兴趣的同学可以到Codeplex.com 去找一下Cosmos项目,开源操作系统。。。
里面有很多宝贝,只是我精力有限。。。
而且不是闲人,整天忙着做一些重复劳动去挣钱,没那么多时间 研究。。。
希望以后等我有钱了,闲了,再看看吧。
C#也一直在更新自己,但是,不知道为什么微软总是在我们非常需要的东西上,就是不给你。
我至今 也不知道怎么给微软反馈。。。
之前上过MSDN的社区,感觉做得很烂,而且Windows Live 登录要很久很久很久。。。
发个帖子也要很久很久很久。。。想想算了吧,MS要是哪一天倒掉了,我还要继续活下去。。。
自从有了ORM之类的需求,也就有了一个实质存在的棘手问题。
那就是,如何知道某个类型的的字段。
而最简单的需求就像下面这样:
我们先定义一个实体:
public class Model { public static string Name{get;set;} }
ok,我们最简单的需求就是需要像下面这样调用:
string selectstring; selectstring="select "+Model.Name+" from " + Model; //而我们希望得到selectstring的结果是下面这样: //selectstring output: select Name from Model
很可惜不行,因为编译器会报N个错误。。。。
我们知道,静态成员的调用是下面这样:
//假设有下面这个类 public class SModel { public string Name{get;set;} } //而调用就是下面这样: SModel.Name
但是,当我们在同一个类中写两个相同的属性的名称是不可行的:
//假设有下面这个类 public class SModel { public string Name{get;set;} public static string Name{get;set;} } //上面的定义会直接报错。。。。
那么总结一下,为什么不能实现像我们上面所需要的那样呢。。。
既然当我们调用例如:
SModel.Name
的时候,编译器已经给给我们剔除了静态字段和实例字段不可以重复。因此就不会产生冲突。
但是,还有一个问题,就是编译器不知道
我们上面那样调用到底是要获取SModel.Name的值还是 这个字段的名称 "Name".
我的想法是这样,可以增加一个关键字例如 :"@"或者"$"之类的
而这个关键字的作用是标识我们要取的时候:
这样我们需要的时候就可以像这样:
@SModel //得到"SModel" @SModel.Name //得到"Name" //于此同时还可以增加一个变量用于保存成员的名称的列表: //例如下面这样: @SModel@ //这个语法可以输出所有的成员列表,例如返回一个数组什么。。。 @SModel@[i] //这个语法可以根据索引获取成员名称。。。
//多好的办法,但问题是.net 本身比较封闭,与此同时,其实我在想,要是C#编译器本身可以提供一些插件式的接口,例如上面的这个功能官方不给我们实现,我们自己实现的话,应该会非常不错的。但是很可惜。
事实是没有。。。回到现实。
大家任然在苦逼地纠结着。。。。去实现。。。
这里吐槽一下作为.net 程序员的辛苦。应该说.net 的开发,类库的强大,也给我们带来了不少方便,但是与此同时。
由于MS自身并没有提供对操作系统更加完整的封装,我们很累。。。
还有就是其实C#也可以操作硬件。为什么不可以,当然可以。C#也可以写驱动。。。
只是。。。
我们需要的是一个 编译器。
一个平台,一个支持。
对于C#写汇编有兴趣的同学可以到Codeplex.com 去找一下Cosmos项目,开源操作系统。。。
里面有很多宝贝,只是我精力有限。。。
而且不是闲人,整天忙着做一些重复劳动去挣钱,没那么多时间 研究。。。
希望以后等我有钱了,闲了,再看看吧。
C#也一直在更新自己,但是,不知道为什么微软总是在我们非常需要的东西上,就是不给你。
我至今 也不知道怎么给微软反馈。。。
之前上过MSDN的社区,感觉做得很烂,而且Windows Live 登录要很久很久很久。。。
发个帖子也要很久很久很久。。。想想算了吧,MS要是哪一天倒掉了,我还要继续活下去。。。
相关文章推荐
- 为什么silverlight的PasswordBox控件的password属性不可以绑定?该如何实现绑定?
- 通过java反射得到javabean的属性名称和值参考
- device_create为何可以在/sys/class/具体类/属性文件?怎么实现的
- Qt按钮为什么设置了三态点击样式效果,无法得到预期,enabled属性为何无法选中 - C/C++解惑之Qt
- Java反射 类类型就是可以操作的类本身 如何通过反射得到函数 函数返回值 函数参数
- 反射实际上就是得到程序集中的属性和方法
- 反射机制访问对象类型——知道对象的某个属性名称得到该属性的值(自己写的列子以后参考用)
- JAVA利用反射得到类的属性名称
- 对于ajax为什么可以实现不更新页面的理解
- 想实现改变画笔的属性,为什么实现不行?
- html中表单使用post方式提交,为什么没有值? get方式可以得到控件的值
- java反射与注解方式实现通用类属性对比
- 为什么拨号得到的32位掩码的IP可以上网?
- 今天无意中发现JavaBean类基本都要求实现了Serializable接口,以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取,但不知道为什么需要序列化,今天总结一下
- Java反射得到属性的值和设置属性的值
- 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有
- C#实现获取不同对象中名称相同属性的方法
- C# 可以利用反射给只读属性赋值吗?
- 利用JAVA的动态属性之反射原理实现一个简单AOP容器 - AOP的实现原理分析
- python 模块会导入几次?猴子补丁为什么可以实现?