Type.GetProperties不返回任何属性

时间:2014-02-19 22:05:19

标签: c# properties

我正在尝试遍历类中的每个属性,输出属性的名称和值。但是我的代码没有返回任何属性。

通过以下方式循环:

public class GameOptions
{
    public ushort Fps;
    public ushort Height;
    public ushort Width;
    public bool FreezeOnFocusLost;
    public bool ShowCursor;
    public bool StaysOnTop;
    public bool EscClose;
    public string Title;
    public bool Debug;
    public int DebugInterval = 500;
}

用于遍历所有代码的代码:

foreach (PropertyInfo property in this.Options.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
    debugItems.Add("Setting Name: " + property.Name);
    debugItems.Add("Setting Value: " + property.GetValue(this,null));
}

然而,当我将public ushort Fps;更改为public ushort Fps { get; set; }时,它会找到它。

5 个答案:

答案 0 :(得分:7)

public ushort Fps;
public ushort Height;
...

它们不是属性而是字段。请尝试使用GetFields。或者,可能更好,将它们转换为属性。 E.g。

public ushort Fps {get; set;}
public ushort Height {get; set;}

答案 1 :(得分:3)

您的类仅包含字段,因此GetProperties将返回空数组。

使用GetFields()代替

foreach (FieldInfo field in this.Options.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
    debugItems.Add("Setting Name: " + field.Name);
    debugItems.Add("Setting Value: " + field.GetValue(this));
}

将您的字段更改为属性

public class GameOptions
{
    public ushort Fps { get; set; }
    public ushort Height { get; set; }
    public ushort Width { get; set; }
    // (...)
}

答案 2 :(得分:2)

找到public ushort Fps { get; set; }但不是public ushort Fps;的原因是因为后者是字段,而不是属性。

对于字段,您必须使用Type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

Type.GetFields

答案 3 :(得分:1)

GameOptions不包含属性。它们都是字段。

执行此操作时:

public ushort Fps { get; set; }

您正在定义auto-implemented属性,这意味着后台字段是由幕后编译器创建的。当您想要使用字段时,无论如何:

this.Options.GetType().GetFields();

答案 4 :(得分:1)

public class GameOptions
{
    public ushort Fps;
    public ushort Height;
    //...
}

那些是你在那里的领域。


要么使用GetFields method,它会返回FieldInfo objects数组:

Type type = this.Options.GetType();
var fields = type.GetFields(
    BindingFlags.Instance |
    BindingFlags.Public |
    BindingFlags.NonPublic);

foreach (var field in fields)
{
    debugItems.Add("Setting Name: " + field.Name);
    debugItems.Add("Setting Value: " + field.GetValue(this));
}

将字段设为(auto-implemented)属性:

public class GameOptions
{
    public ushort Fps { get; set; }
    public ushort Height { get; set; }
    //...
}