如何使用反射从嵌套类读取静态属性
本文关键字:读取 静态 属性 嵌套 何使用 反射 | 更新日期: 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,或者至少用它的名称空间限定类型名称。