在反射中Member{get{..}set{..}}与Member{get;set;}的区别?

最近的在写代码的时候,需要用到反射来获取类中的所有公开属性值,于是写下如下代码:

 StringBuilder sb = new StringBuilder();
 foreach (var f in this.GetType().GetFields())
 {
     sb.AppendLine(string.Format( "{0}={1};", f.Name,         f.GetValue(this)));
 }
 return sb.ToString();

工作正常,后又在另一处对另外一个类需要获取属性值,于是同样使用了.GetFields();结果……什么都没有得到.....

尝试改成了.GetProperties()........结果该有的都有了,为何?百思不得其解……明明两个类中都是写的公共属性啊,get,set.....怎么第二个类认为这些都是字段呢?

后发现,第一个类中,属性都是这样写的:

privite object _member;

public object Member{
    get{
        return _member;
    }
    set{
        _member=value
    }
}

而第二个类中则是这样写的:

public object Member {get;set;}

于是恍然大悟,在反射机制中,第二种写法竟然被认为是属性?

又拿出reflector利器,结果……第二种写法同样被生成了get和set方法……

呃……这下彻底不明了……

时间: 2025-01-05 02:02:32

在反射中Member{get{..}set{..}}与Member{get;set;}的区别?的相关文章

理解#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member)

#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member) 这个东西很多人应该知道: offsetof是用来判断结构体中成员的偏移位置.他是一个宏定义. (struct_t *)0是一个指向struct_t类型的指针,其指针值为 0,所以其作用就是把从地址 0 开始的存储空间映射为一个 struct_t 类型的对象.((struct_t *)0)->member 是访问类型中的成员 member,相应地 &

C#中 反射中的Assembly(装载程序集):

反射中的Assembly(装载程序集):可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息. 1  String assemblyName = @"NamespaceRef";//命名空间 2     String strongClassName = @"NamespaceRef.China";//需要动态生成的类交China Assembly.Load(assemblyName).CreateInstance(strongClassName);

.NET反射中BindingFlags的值

BindingFlags.Default 不指定绑定标志 BindingFlags.IgnoreCase 表示忽略 name 的大小写,不应考虑成员名的大小写 BindingFlags.DeclaredOnly 只应考虑在所提供类型的层次结构级别上声明的成员.不考虑继承成员. BindingFlags.Instance 只搜索实例成员 BindingFlags.Static 只搜索静态成员 BindingFlags.Public 只搜索公共成员 BindingFlags.NonPublic 只搜

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址; 4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型.巧妙之处在于将0转 换成(TY

在java反射中 Class.forName和classLoader的区别

解释 在java中,Class.forName()和ClassLoader()都可以对类进行加载,ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是"通过一个类的全限定名来获取描述此类的二进制字节流",获取到二进制流后放到JVM中.Class.forName()方法实际上也是调用的CLassLoader来实现的. Class.forName(String className)这个方法的源码是: 最后调用的方法是forName0这个方法,在这个forN

java反射中Class详解

package com.hey.reflect; /** * 1.万事万物皆对象,class类同样是Class类的实例对象,比如说一个Student类是Class的实例对象(类是对象,是java.lang.Class类的实例对象) * * 2.有三种方式获取一个类的类类型 * * 3.我们可以通过类的类类型,创建类的实例对象 * */public class ReflectDemo { public static void main(String[] args) { //Foo的实例对象怎么表示

反射中getFields()与getDeclaredFields()区别

* getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法 * getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方

Java反射中的getClass()方法

Java反射学习 所谓反射,可以理解为在运行时期获取对象类型信息的操作.传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码.严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多. 1,获得类型类 我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类.Object类中包含一个方法名叫getClass,利用这个方

反射中getMethods 与 getDeclaredMethods 的区别

public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法.public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共.保护.默认(包)访问和私有方法,但不包括继承的方法.当然也包括它所实现接口的方法. public static void main(String[] args) throws ClassNotFoundException, Illeg