鉴于我有一个结构如下的对象: -
RootObject
Personal
Forename
Surname
Middlename
Telephone
LandLine
Mobile
当我提供
<Ruleset>
<Field>Personal.Forename</Field>
<FieldValue>World</Field>
</Ruleset>
<Ruleset>
<Field>Personal.Surname</Field>
<FieldValue>Hello</Field>
</Ruleset>
当我供应商规则集
时我想要&#39;个人&#39;根据要求初始化RootObject中的对象,而电话未初始化(反之亦然)。
请告知我如何在整个RootObject子(以及孩子的孩子)中编写初始化/构造函数代码,以便我能够实现这一点,因为我正在寻找可以使用的动态解决方案无需在初始化代码段上进行返工。感谢
答案 0 :(得分:0)
不知道我是否理解正确,但如果你想要,你可以使用反射。
如果你RuleSet
看起来像这样:
public class RulleSet
{
public string ObjectName { get; set; }
public string PropertyName { get; set; }
public object value { get; set; }
}
您可以在课堂上创建方法:
public void Initialize(RulleSet initRule)
{
var initializableObject = this.GetType().GetProperty(initRule.ObjectName).GetValue(this,null);
//If object not initialized, we need to create it
if (initializableObject == null)
{
initializableObject =
Activator.CreateInstance(this.GetType().GetProperty(initRule.ObjectName).PropertyType);
PropertyInfo propertyInfo = this.GetType().GetProperty(initRule.ObjectName);
propertyInfo.SetValue(this, Convert.ChangeType(initializableObject, propertyInfo.PropertyType), null);
}
//If we have object, we created it or it already axist doesn't matter we set property
if (initializableObject != null)
{
var initializableProperty =
initializableObject.GetType().GetProperty(initRule.PropertyName).GetValue(initializableObject, null);
initializableProperty = Activator.CreateInstance(initializableObject.GetType().GetProperty(initRule.PropertyName).PropertyType);
PropertyInfo propertyInfo = initializableObject.GetType().GetProperty(initRule.PropertyName);
propertyInfo.SetValue(initializableObject, Convert.ChangeType(initializableProperty, propertyInfo.PropertyType), null);
}
}
没有测试:)所以可能存在一些错误,如果你想让它可以使它静态,只需在方法中添加额外的参数来代表你的初始化对象,并用这个参数替换this
。
PS。由于使用反射,它可能会慢于编码初始化。