我有一些配置存储在以下数据结构中,它使用嵌套类进行组织。
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");
答案 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或至少使用其命名空间限定类型名称。