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

本文关键字:类型 参数约束 运行时 反射 提取 | 更新日期: 2023-09-27 17:50:23

请查看示例代码:

    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

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

你将不得不使用MakeGenericMethod(),因为你在编译时不知道你将使用什么类型:

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