根据需要在Runtime上动态初始化对象

时间:2017-01-17 06:27:37

标签: c#

鉴于我有一个结构如下的对象: -

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子(以及孩子的孩子)中编写初始化/构造函数代码,以便我能够实现这一点,因为我正在寻找可以使用的动态解决方案无需在初始化代码段上进行返工。感谢

1 个答案:

答案 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。由于使用反射,它可能会慢于编码初始化。