Рекурсивный вызов универсального метода с новым типом из PropertyInfo? - PullRequest
3 голосов
/ 16 мая 2011

У меня есть класс клиента с адресом подкласса

internal class Customer    
{
    public int id { get; set; }
    public string name { get; set; }

    [ObjectDefRelation(isSubClass = true)]
    public Addressinformation Addressinformation { get; set; }
}

internal class Addressinformation 
{
    public string street { get; set; }
}

У меня есть метод для заполнения этого объекта данными из xml. Теперь я хочу назвать этот метод рекурсивным, когда он прибудет в подкласс Addressinformation. Как я могу вызвать мой общий метод с информацией от PropertyInfo?

public static T ConvertXmlToClass<T>(XmlDocument xmlDocumentObjectDef, XmlNode xmlNode, ObjectDefRelationAttribute parentClass = null) where T : new()
{
    ObjectDefRelationAttribute defRelationAttribute;
    T xmlToClass = new T();

    foreach (PropertyInfo field in xmlToClass.GetType().GetProperties())
    {
        foreach (Attribute attr in field.GetCustomAttributes(true))
        {
            defRelationAttribute = attr as ObjectDefRelationAttribute;
            if (null != defRelationAttribute)
            {
                if (defRelationAttribute.isSubClass)
                {
                    // 
                    // here I need help to call the recursive method (XXX)
                    //
                    var subClass = Helper.ConvertXmlToClass<XXX>(xmlDocumentObjectDef, xmlNode, defRelationAttribute);
                }
            }
        }
    }
}

Я использовал лучший ответ с некоторыми изменениями:

Type typeArguments = GetType(field.PropertyType.Namespace + "." + field.PropertyType.Name);
object value = typeof(Helper).GetMethod("ConvertXmlToClass").MakeGenericMethod(typeArguments).Invoke(null, new object[] {xmlDocumentObjectDef, xmlNode, defRelationAttribute});

Ответы [ 2 ]

2 голосов
/ 16 мая 2011

Похоже, у вас есть функция, которая преобразует имена типов в типы, что-то вроде этого:

Type GetType(string typeName)
{
    return Type.GetType(typeName);
}

тогда вы можете вызвать этот метод как:

object value = typeof(owningType).GetMethod("ConvertXmlToClass").MakeGenericMethod(GetType(typeName)).Invoke(xmlDocumentObjectDef, xmlNode, xmlToClass);

и используйте PropertyInfo.SetValue(), чтобы установить его для свойства

1 голос
/ 16 мая 2011

Если вы хотите придерживаться своего текущего подхода, тогда вам нужно использовать отражение для построения универсального вызова метода из field.PropertyType, как описано здесь: Отражение и универсальные типы

ОднакоВы также можете рассмотреть возможность изменения метода для принятия Type в качестве параметра вместо создания универсального метода (подсказка, вы можете использовать Activator.CreateInstance(type) для создания экземпляра объекта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...