我在最近几个小时内进行了搜索和测试,但我似乎无法得到我之后的结果。 我试图从嵌套属性中获取值。
我可以获取属性名称而不会出现以下问题。
public static IList<string> GetClassPropertyNames(object myObject)
{
List<string> propertyList = new List<string>();
if (myObject != null)
{
var a = myObject.GetType().GetProperty("inobjects").PropertyType.GetProperties();
foreach (var prop in a)
{
propertyList.Add(prop.Name.ToString());
}
}
return propertyList;
}
但是,如果我使用其中一个名称作为字符串来获取属性,我就无法获得正确的对象或输入GetValue(Object,null)来获取我需要的值。
我正在使用以下内容。
public static string GetNestedProperty(object myObject, string PropertyName)
{
string s = null;
var a = myObject.GetType().GetProperty("inobjects").PropertyType.GetProperties();
foreach (PropertyInfo pi in a)
{
if(pi.Name == PropertyName)
{
s = pi.GetValue(???, null).ToString();
}
}
return s;
}
我希望保持实际类型的通用性,因为我正在使用&#34; inobjects&#34;作为一个属性来获取不同类的很多属性,并希望以一种方式访问属性名称和值。
我只是无法在正确的级别获得正确的对象,因此不断出现与我的类型不相关的问题。任何帮助将不胜感激。
答案 0 :(得分:3)
您的问题实际上归结为您需要获取 immediate 属性的实例,从该属性中提取嵌套属性的值。
具体而言 - 您需要获取直接属性的值(实例)&#34; inobjects&#34;在您可以解析嵌套属性propertyName
的值之前。
理想情况下,您将缓存PropertyInfo
实例,但要使代码以最简单的方式工作 - 解析如下值:
...
if (pi.Name == PropertyName)
{
var value =
myObject.GetType()
.GetProperty("inobjects")
.GetValue(myObject, null);
s = (string) pi.GetValue(value, null);
}
您可能有兴趣知道您不需要手动迭代每个属性,而是可以使用GetProperty
代替(如果属性不存在,将返回null
)。我冒昧地为你重构代码:
public static string GetNestedProperty(object value, string propertyName)
{
var type = value.GetType();
var property = type.GetProperty("inobjects");
value = property.GetValue(value, null);
type = property.PropertyType;
property = type.GetProperty(propertyName);
if (property == null)
{
return null;
}
value = property.GetValue(value, null);
return (string) value;
}
答案 1 :(得分:0)
我可以看到一些事情:
1)(这可能不是问题,但发布它不会有什么伤害)你正在使用一个foreach循环,当条件满足时没有任何中断,这可能会导致一些麻烦,因为你可能有另一个满足条件。
2)这是关于你想要从中获取值的对象的???
。因此,如果您知道嵌套对象在对象中有多远,则只需将条件提取出来并将其保持到该行。如果它是"inobjects"
对象,只需将a
的设置中断,即可获得它。像这样:
var rawNestedObject = myObject.GetType().GetProperty("inobjects");
var a = nestedObject.PropertyType.GetProperties();
然后您的???
标记可以替换为nestedObject
,这将是从rawNestedObject
中提取的引用。
APPEND:此外,您没有在GetProperty
调用上使用任何默认为公共实例属性的标记。我不知道您为公共成员命名的标准是什么,因此如果您正在访问公共实例属性,请随意忽略此段落。
答案 2 :(得分:0)
这将获得内在属性的值:
var a = obj.GetType().GetProperty("inobjects").PropertyType.GetProperties();
foreach (var item in a)
{
if (item.Name == PropertyName)
{
var test = obj.GetType().GetProperty("inobjects").GetValue(obj,null);
s = (string)test.GetType().GetProperty(PropertyName).GetValue(test, null);
}
}
这不是最干净的方式,但这个例子会这样做。