开发者

how can a type extracted through reflection on runtime be used in "Constraints on Type Parameters"

开发者 https://www.devze.com 2023-02-25 00:11 出处:网络
Please go through the sample code: public T LoadWithChildren<T>(object key, object myObject) where T : class, new()

Please go through the sample code:

    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();
    }

if you see that at the end when the method LoadWithChildren(object ke开发者_StackOverflow社区y, object myObject) is recursively calling itself, I am trying to use "tempType", a "Type" object as Type Parameter since the type is not known and reflection is being used to get the type on run time. But its not accepting the "Type" object rather it asks for a class or a parameter less constructor. I would be obliged if someone can help me out. You suggestions, solutions and knowledge would be appreciated.

Regards, Umair


You are going to have to use MakeGenericMethod() since you don't know at compile time what type you are going to use:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号