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} );
精彩评论