列出具有特定属性的字段

时间:2018-08-29 14:49:12

标签: c# reflection

我试图列出具有特定属性的所有字段,但仍不太了解GetValue()期望的对象类型。

[AttributeUsage(AttributeTargets.Field, AllowMultiple = true)]
class SerializedAttribute : Attribute
{

}

class Program
{
    [Serialized] public Single AFloat = 100.0f;
    [Serialized] public Single AnotherFloat = 125.5f;
    [Serialized] public Single OnceAgain = 75.0f;

    static void Main(string[] args)
    {

        foreach(FieldInfo field in typeof(Program).GetFields())
        {
            foreach(Attribute attr in field.GetCustomAttributes())
            {
                if (attr is SerializedAttribute)
                {
                    Console.WriteLine("\t" + "Variable name: " + field.Name + "\t" + "Variable value:" + field.GetValue(/*"??????????????"*/));           
                }
            }
        }

        Console.ReadKey();

    }
}

我尝试了很少的Google搜索,但显然我不是很擅长解决问题。

2 个答案:

答案 0 :(得分:1)

GetValue需要Program

的实例
var program = new Program();
foreach (FieldInfo field in typeof(Program).GetFields())
{
    foreach (Attribute attr in field.GetCustomAttributes())
    {
        if (attr is SerializedAttribute)
        {
            Console.WriteLine("\t" + "Variable name: " + field.Name + 
                "\t" + "Variable value:" + field.GetValue(program));
        }
    }
}

也许您打算将这些属性设为static,在这种情况下,您需要将null传递给GetValue。尽管由于您正在寻找SerializedAttribute,所以情况似乎并非如此。

答案 1 :(得分:1)

如果您有课程:

public class MyClass
{
     .. fields ..
}

然后您做

foreach (FieldInfo field in typeof( >> MyClass << ).GetFields()) ...

您可以访问该类型的元数据(字段信息)。

然后,如果要从特定字段中获取一些数据,则需要将MyClass实例传递给GetValue(..)方法。因为我需要数据源。

如果字段为static,则表示它不是MyClass实例的一部分,因此您只需传递null值。

所以最后您应该这样做:

var instance = new MyClass();

var value = field.GeValue(instance);