如何通过运行时反射提取的类型在“类型参数约束”中使用

时间:2011-04-15 21:29:00

标签: c# reflection parameters constraints

请仔细阅读示例代码:

    public T LoadWithChildren<T>(object key, object myObject) where T : class, new()
    {
        //T myObject = new T();
        SelectOne(myObject, key);

        /// Caching all non-generic type objects.
        Type objectType = typeof(T);

        PropertyInfo[] propertyInfo = objectType.GetProperties();
        List<object> NonGenericProperty = new List<object>();
        List<object> Parents = new List<object>();
        List<object> Children = new List<object>();

        foreach (PropertyInfo property in propertyInfo)
        {
            if (property.PropertyType.IsPrimitive == false && property.PropertyType.FullName != "System.Byte"
                && property.PropertyType.Name != "System.SByte" && property.PropertyType.Name != "System.Int32"
                && property.PropertyType.Name != "System.UInt32" && property.PropertyType.Name != "System.Int16"
                && property.PropertyType.Name != "System.UInt16" && property.PropertyType.Name != "System.Int64"
                && property.PropertyType.Name != "System.UInt64" && property.PropertyType.Name != "System.Single"
                && property.PropertyType.Name != "System.Double" && property.PropertyType.Name != "System.Char"
                && property.PropertyType.Name != "System.Boolean" && property.PropertyType.Name != "System.Object"
                && property.PropertyType.Name != "System.Object" && property.PropertyType.Name != "System.String"
                && property.PropertyType.Name != "System.Decimal")
            {
                NonGenericProperty.Add(property);
            }
        }

        /// Separate All children 
        foreach (object NonGenericObject in NonGenericProperty)
        {
            /// Checking for child attributes
            foreach (object attribute in ((PropertyInfo)NonGenericObject).GetCustomAttributes(true))
            {
                /// If the attribute is ChildObjectAttribute
                if (attribute is ChildObjectAttribute)
                {
                    Children.Add(NonGenericObject);

                    Type tempType = ((PropertyInfo)NonGenericObject).PropertyType;

                    PropertyInfo[] tempProperty = tempType.GetProperties();


                    // if the child is not a Generic type like list
                    if (((PropertyInfo)NonGenericObject).PropertyType.IsGenericType == false)
                    {
                        foreach (PropertyInfo property in tempProperty)
                        {
                            foreach (object childAttribute in property.GetCustomAttributes(true))
                            {
                                if (childAttribute is ParentObjectAttribute && property.PropertyType == typeof(T))
                                {
                                    /// Set the parent reference of child object to myObject
                                    object childObject = new object();
                                    property.SetValue(childObject, myObject, null);
                                    LoadWithChildren<tempType>(1, childObject);


                                }
                            }
                        }
                    }
                    /*if (((PropertyInfo)NonGenericObject).PropertyType.IsGenericType == true)
                    {
                        foreach(PropertyInfo property )
                        {

                        }
                    }*/
                }
            }
        }

        /// Separate All parents  
        foreach (object NonGenericObject in NonGenericProperty)
        {
            foreach (object attribute in ((PropertyInfo)NonGenericObject).GetCustomAttributes(true))
            {
                if (attribute is ParentObjectAttribute)
                {
                    Parents.Add(NonGenericObject);
                }
            }
        }


        /// Caching all  






        throw new NotImplementedException();
    }

如果你看到最后当方法LoadWithChildren(对象键,对象myObject)递归调用自身时,我试图使用“tempType”,一个“Type”对象作为Type参数,因为该类型是未知的,反射被用于获取运行时的类型。但它不接受“类型”对象,而是要求一个类或一个参数较少的构造函数。如果有人可以帮助我,我将不得不承担责任。您的建议,解决方案和知识将不胜感激。

此致 Umair

1 个答案:

答案 0 :(得分:2)

您将不得不使用MakeGenericMethod(),因为您在编译时不知道您将使用哪种类型:

MethodInfo method = typeof(WhateverContainsThisMethod).GetMethod("LoadWithChildren");
MethodInfo mi= method.MakeGenericMethod(tempType);
mi.Invoke(this, new object[] {1, childObject} );