как можно использовать тип, извлеченный посредством отражения во время выполнения, в «Ограничениях на параметры типа» - PullRequest
0 голосов
/ 16 апреля 2011

Пожалуйста, просмотрите пример кода:

    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"объект «Тип» в качестве параметра типа, поскольку тип неизвестен, а отражение используется для получения типа во время выполнения.Но он не принимает объект «Тип», а запрашивает класс или конструктор без параметров.Я был бы признателен, если кто-то может мне помочь.Ваши предложения, решения и знания будут оценены.

С уважением, Umair

1 Ответ

2 голосов
/ 16 апреля 2011

Вам нужно будет использовать MakeGenericMethod(), так как во время компиляции вы не знаете, какой тип вы собираетесь использовать:

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