使用PropertyInfo中的新类型对泛型方法进行递归调用?

时间:2011-05-16 09:06:19

标签: c# reflection recursion

我有一个带有子类地址的客户类

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 个答案:

答案 0 :(得分:2)

似乎你有一个将Type名称转换为Types的函数,如下所示:

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

然后您可以将此方法称为:

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

并使用PropertyInfo.SetValue()在属性

上设置它

答案 1 :(得分:1)

如果您想坚持使用当前的方法,那么您需要使用反射来构建来自field.PropertyType的泛型方法调用,如下所述:Reflection and generic types

但是,您也可以考虑更改方法以接受Type作为参数,而不是使用泛型方法(提示您可以使用Activator.CreateInstance(type)来实例化对象)。