如何使用反射从嵌套类读取静态属性

本文关键字:读取 静态 属性 嵌套 何使用 反射 | 更新日期: 2023-09-27 18:01:47

我在以下数据结构中存储了一些配置,该数据结构使用嵌套类用于组织。

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");

如何使用反射从嵌套类读取静态属性

获得该属性的方法实际上非常直接,但您必须提供所有必要的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,或者至少用它的名称空间限定类型名称。