反射不从中提取值:具有属性的密封类,该属性是另一个密封类的对象
本文关键字:属性 密封类 对象 另一个 提取 反射 | 更新日期: 2023-09-27 18:37:03
我正在使用对象通过反射重新评估属性。GetType()。GetProperty(string propertyName)。
如果 obj 是密封类但将属性作为正常公共类的对象,则这工作正常。但是,如果此属性包含密封的类对象,则它不会通过 GetProperty() 方法返回任何属性。
尝试通过 Prpty1 -->Prpty2-->Prpty3. 参数从基类对象递归迭代。属性包含 Prpty1 、Prpty2、Prpty3 的字符串数组。我无法获得 Prpty2,它以 Null 的形式出现。使用下面编写的方法进行此访问。
示例代码如下:
//Methods below are used to extract value from Object (basically BaseClass Object)
private string EvaluateObject(object obj, MappedParameter param)
{
object evaluatedObj = obj;
foreach (string s in param.Properties)
{
evaluatedObj = EvalProperty(evaluatedObj, s);
}
return (evaluatedObj == obj ? null : evaluatedObj.ToString());
}
private object EvalProperty(object obj, string propertyName)
{
System.Reflection.PropertyInfo propInfo = obj.GetType().GetProperty(propertyName);
if (propInfo == null)
throw new Exception("Invalid Property token");
object propertyValue = propInfo.GetValue(obj, null);
return propertyValue;
}
//Below classes are Data Wrappers
namespace TryClassLibrary
{
public class BaseClass
{
private NestedClass _Data = new NestedClass();
public NestedClass Prpty1
{
set { _Data = value; }
get { return _Data; }
}
}
}
namespace TryClassLibrary
{
public sealed class NestedClass
{
public int Id { get; set; }
public NestedNestedClass Prpty2 = new NestedNestedClass();
}
public sealed class NestedNestedClass
{
private string _Message;
public NestedNestedClass()
{
Prpty3 = "Test value";
}
public string Prpty3
{
set
{
_Message = value;
}
get { return _Message; }
}
}
}
请有人帮助我找到访问 Prpty2、Prpty3 的方法,还是使用反射时的一些现有限制。谢谢。
啊,问题很简单:Prpty2
不是一个属性:它是一个字段:
public NestedNestedClass Prpty2 = new NestedNestedClass();
应该是:
private readonly NestedNestedClass prpty2 = new NestedNestedClass();
public NestedNestedClass Prpty2 { get { return prpty2; } }
(或类似)
然后一切正常:
object obj = new BaseClass();
obj = obj.GetType().GetProperty("Prpty1").GetValue(obj, null);
obj = obj.GetType().GetProperty("Prpty2").GetValue(obj, null);
obj = obj.GetType().GetProperty("Prpty3").GetValue(obj, null);
string s = obj.ToString(); // "Test value"
有关信息,如果您正在做很多此类工作 - 也许可以查看FastMember; 它更方便,并且经过大量优化,因此无需支付反射税。