通过路径获取propertyInfo?
Get the propertyInfo by the path to it?
我想通过如下路径获取 propertyInfo
:
string path = "window.position.x";
举个例子:
PropertyInfo p = typeof(WindowManager).GetProperty(path);
WindowManager 有一个名为 "window" 的 属性,它有一个名为 "position" 的 属性,还有一个 属性 "x"。
有什么方法可以实现吗?不幸的是 GetProperty
不适用于这样的路径。
您必须在分隔符 (.) 上拆分 path
以获得 class、属性 和 sub-property。
粘性部分正在将 "window" 映射到 WindowManager
。您将需要某种将字符串名称映射到已知类型的字典或散列 table,以便您可以查找它们。
了解 "root type" 后,反思其属性是一项相对简单的反思练习。对于初学者,我可能会向您指出 Activator.CreateInstance
、GetProperties
,可能还有 Assembly.GetReferencedAssemblies
,所有这些都记录在 MSDN 上。
注意:您的路径看起来可以接受所有小写字母。当您尝试将类型和 属性 名称相互映射时,这一点很重要。
您可以拆分 path
并遍历元数据。试试这个代码:
var type = typeof(WindowManager);
PropertyInfo property;
foreach (var prop in path.Split('.'))
{
property = type.GetProperty(prop);
if (property == null)
{
// log error
break;
}
type = property.PropertyType;
}
// now property is x
请注意,您应该在每次迭代时检查 property
以确保您的路径有效
如果您确定路径正确,请使用此
string path = "window.position.x";
var pathArr = path.Split('.');
var property = typeof(WindowManager).GetProperty(pathArr[0]).PropertyType
.GetProperty(pathArr[1]).PropertyType
.GetProperty(pathArr[2]);
我想通过如下路径获取 propertyInfo
:
string path = "window.position.x";
举个例子:
PropertyInfo p = typeof(WindowManager).GetProperty(path);
WindowManager 有一个名为 "window" 的 属性,它有一个名为 "position" 的 属性,还有一个 属性 "x"。
有什么方法可以实现吗?不幸的是 GetProperty
不适用于这样的路径。
您必须在分隔符 (.) 上拆分 path
以获得 class、属性 和 sub-property。
粘性部分正在将 "window" 映射到 WindowManager
。您将需要某种将字符串名称映射到已知类型的字典或散列 table,以便您可以查找它们。
了解 "root type" 后,反思其属性是一项相对简单的反思练习。对于初学者,我可能会向您指出 Activator.CreateInstance
、GetProperties
,可能还有 Assembly.GetReferencedAssemblies
,所有这些都记录在 MSDN 上。
注意:您的路径看起来可以接受所有小写字母。当您尝试将类型和 属性 名称相互映射时,这一点很重要。
您可以拆分 path
并遍历元数据。试试这个代码:
var type = typeof(WindowManager);
PropertyInfo property;
foreach (var prop in path.Split('.'))
{
property = type.GetProperty(prop);
if (property == null)
{
// log error
break;
}
type = property.PropertyType;
}
// now property is x
请注意,您应该在每次迭代时检查 property
以确保您的路径有效
如果您确定路径正确,请使用此
string path = "window.position.x";
var pathArr = path.Split('.');
var property = typeof(WindowManager).GetProperty(pathArr[0]).PropertyType
.GetProperty(pathArr[1]).PropertyType
.GetProperty(pathArr[2]);