Definir valores de propriedade aninhados usando reflexões

Eu procurei por toda parte, mas não consegui encontrar a resposta exata para a minha pergunta. Tomemos por exemplo o seguinte código:

public class Company
{
    private string m_strName;
    private Customer m_objCustomer;

    public Company()
    {
        m_strName = "";
        m_objCustomer = new Customer();
    }

    public string Name
    {
        get { return m_strName; }
        set { m_strName = value; }
    }

    public Customer CustomerInformaion
    {
        get { return m_objCustomer; }
        set { m_objCustomer = value; }
    }
}

public class Customer
{
    private string m_strName;
    private Details m_objDetails;


    public Customer()
    {
        m_strName = "";
        m_objDetails = new Details();
    }

    public string Name
    {
        get { return m_strName; }
        set { m_strName = value; }
    }

    public Details CustomerDetails
    {
        get { return m_objDetails; }
        set { m_objDetails = value; }
    }
}

public class Details
{
    private string m_strPhoneNumber;
    private string m_strEmailAddress;

    public Details()
    {
        m_strPhoneNumber = "";
        m_strEmailAddress = "";
    }

    public string PhoneNumber
    {
        get { return m_strPhoneNumber; }
        set { m_strPhoneNumber = value; }
    }

    public string EmailAddress
    {
        get { return m_strEmailAddress; }
        set { m_strEmailAddress = value; }
    }
}

Agora, configurei um Formulário que possui muitos campos de texto nos quais um usuário pode inserir informações sobre um cliente em uma empresa. Um desses campos é o campo de texto Endereço de email que possui uma propriedade Tag definida como EmailAddress. Eu quero ser capaz de olhar para o Tag do TextBox e percorrer todo o objeto da empresa para localizar uma propriedade com um nome correspondente e defina seu valor para a propriedade Text do TextBox. Eu posso localizar a propriedade, mas definir o seu valor acabou por ser bastante difícil. Aqui está o que eu tenho até agora:

foreach (PropertyInfo info in m_objCompany.GetType().GetProperties())
{
    if (info.PropertyType != typeof(System.String))
    {
        foreach (PropertyInfo info2 in info.PropertyType.GetProperties())
        {
            if (objTextBox.Tag.Equals(info2.Name))
            {
                if (info2.CanWrite)
                {
                    Object objValue = Convert.ChangeType(objTextBox.Text, info.PropertyType);
                    info2.SetValue(m_objCompany, objValue, null);
                }
            }

        }
    }
}

Meu problema é que, quando eu executo o código, recebo um erro no ChangeType e / ou SetValue. A questão é que o Reflection está parando em info2 e tentando definir o valor para o Type of Details - já que é o pai do Property EmailAddress.

Qualquer ajuda para determinar como apontar o SetValue para a propriedade apropriada seria útil e apreciada. Como eu tenho certeza que você pode adivinhar minha classe é um grande negócio maior do que o exemplo fornecido com cerca de 100 propriedades. A maioria são todos valores de string que serão inseridos manualmente através de objetos TextBox. Eu estou tentando criar uma rotina que pode ser chamada por todos os objetos TextBox em que a propriedade de marca do objeto poderia ser usada para indicar qual propriedade da minha classe eu estou tentando definir. De lá, é para terra de serialização XML.

questionAnswers(2)

yourAnswerToTheQuestion