如何在C#Reflection中列出当前类的字段(this.GetType()的问题)?

时间:2011-01-29 12:35:04

标签: c# .net reflection

编译器接受了这一点:

FieldInfo[] fieldInfos;
fieldInfos = typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

编译器不接受:

FieldInfo[] fieldInfos;
fieldInfos = typeof(this.GetType()).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

如何修复第二种语法?

4 个答案:

答案 0 :(得分:9)

typeof()调用周围不需要GetType,因为它已经返回了一个Type对象。 typeof是从类型名称获取Type对象的特殊语法,无需执行Type.GetType("Foo")之类的操作。

FieldInfo[] fieldInfos;
fieldInfos = GetType().GetFields(BindingFlags.NonPublic |
                                 BindingFlags.Instance);

答案 1 :(得分:2)

typeof不允许您传入System.Type的实例。 typeof是一个运算符,其唯一参数是类型(如Int32objectMyClass),并返回System.Type的实例。当您已有对象的实例时,只需调用GetType即可获得System.Type的实例。因此,只需说明

fieldInfos = this.GetType()
                 .GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

答案 2 :(得分:2)

在第二个示例中,您不需要typeof。只需使用:

 FieldInfo[] fieldInfos = this.GetType().GetFields(BindingFlags.NonPublic |
                                                   BindingFlags.Instance);

typeof的要点是获取Type引用的某种“文字”格式。 GetType()已经返回了一个类型,因此您不需要它。

换句话说,假设你想要一个字符串...你不会使用:

string x = "y.ToString()";

你只需要使用

string x = y.ToString();

将引号替换为typeof(),它就是同样的东西......

答案 3 :(得分:2)

FieldInfo[] fieldInfos = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);