如何使用Reflection从嵌套类中读取静态属性?

时间:2016-08-09 17:21:22

标签: c# reflection

我有一些配置存储在以下数据结构中,它使用嵌套类进行组织。

public abstract class LogoSpec
{
    public abstract byte[] Logo { get; set; }

    public class Web
    {
        public static float Height { get; set; }

        public class A4 : Web
        {
            public static float Left { get; set; }
        }
    }
}

public class SampleLogo : LogoSpec
{
    public override byte[] Logo { get; set; }
}

当我确切知道在设计时使用什么价值时,我可以轻松使用它

// Setting values
SampleLogo.Web.A4.Height = 10.25f;

如何编写在运行时检索此值的函数?

float GetValue(string logoName = "SampleLogo", string layout = "Web", string paperSize = "A4", string property = "Height");

1 个答案:

答案 0 :(得分:2)

获得该属性的方法实际上非常简单,但您必须提供所有必要的BindingFlags

PropertyInfo p = typeof(SampleLogo.Web.A4).GetProperty("Height", 
    BindingFlags.Static | 
    BindingFlags.FlattenHierarchy | 
    BindingFlags.Public);

FlattenHierarchy也需要获取基类的属性。

现在您可以使用此PropertyInfo来获取和设置值:

p.SetValue(null, 14f);
float height = (float)p.GetValue(null);

更新:完整的方法可能如下所示:

public float GetValue(string logoName = "LogoSpec", string layout = "Web", string paperSize = "A4", string property = "Height")
{
    Type logoType = Type.GetType(logoName);
    Type layoutType = logoType?.GetNestedType(layout);
    Type paperType = layoutType?.GetNestedType(paperSize);
    PropertyInfo pi = paperType?.GetProperty("Height", BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Public);
    return (float?)pi?.GetValue(null) ?? 0f;
}

但请注意,对于"LogoSpec"而言,您需要使用AssemblyQualifiedName或至少使用其命名空间限定类型名称。