请查看示例代码:
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} );