Hi I have the class for fast invoke
public static class FastInvoke
{
public static Func<T, object> BuildUntypedGetter<T>(MemberInfo memberInfo)
{
var targetType = memberInfo.DeclaringType;
var exInstance = Expression.Parameter(targetType, "t");
var exMemberAccess = Expression.MakeMemberAccess(exInstance, memberInfo); // t.PropertyName
var exConvertToObject = Expression.Convert(exMemberAccess, typeof(object)); // Convert(t.PropertyName, typeof(object))
var lambda = Expression.Lambda<Func<T, object>>(exConvertToObject, exInstance);
var action = lambda.Compile();
return action;
}
public static Action<T, object> BuildUntypedSetter<T>(MemberInfo memberInfo)
{
var targetType = memberInfo.DeclaringType;
var exInstance = Expression.Parameter(targetType, "t");
var exMemberAccess = Expression.MakeMemberAccess(exInstance, memberInfo);
// t.PropertValue(Convert(p))
var exValue = Expression.Parameter(typeof(object), "p");
var exConvertedValue = Expression.Convert(exValue, GetUnderlyingType(memberInfo));
var exBody = Expression.Assign(exMemberAccess, exConvertedValue);
var lambda = Expression.Lambda<Action<T, object>>(exBody, exInstance, exValue);
var action = lambda.Compile();
return action;
}
private static Type GetUnderlyingType(this MemberInfo member)
{
switch (member.MemberType)
{
case MemberTypes.Event:
return ((EventInfo)member).EventHandlerType;
case MemberTypes.Field:
return ((FieldInfo)member).FieldType;
case MemberTypes.Method:
return ((MethodInfo)member).ReturnType;
case MemberTypes.Property:
return ((PropertyInfo)member).PropertyType;
default:
throw new ArgumentException
(
"Input MemberInfo must be if type EventInfo, FieldInfo, MethodInfo, or PropertyInfo"
);
}
}
}
Now I need to execute BuildUntypedSetter
method with parameters (obj,"test value")
Type mytype = MyTypeBuilder.CompileResultType(dtTempAttendance,true);//dynamic object type
var obj = System.Activator.CreateInstance(mytype);//dynamic object
PropertyInfo prop = obj.GetType().GetProperty("EmployeeName", BindingFlags.Public | BindingFlags.Instance);
Type openGeneric = typeof(FastInvoke);
MethodInfo method = openGeneric.GetMethod("BuildUntypedSetter", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod).MakeGenericMethod(mytype);
var setter = method.Invoke(null, new[] { prop }) as Action<object, object>;
//Setter is always null
//setter(obj, "test value");
Is this possible?
Edited To Add: I tried this. Is it possible this way?
method.Invoke(null, new[] { prop }).GetType().GetMethods()[0].Invoke(method.Invoke(null, new[] { prop }).GetType().GetMethods()[0].DeclaringType.Name,new[]{obj,"1"})
I get error:
Object does not match target type.
Thanks for spending your valuable time mates. I overcome this by returning a JSON string and parsing it using JSON.parse() at then
function
string jsonRowData = "[";
foreach (DataRow dr in dtEmp.Rows)
{
jsonRowData += "{";
foreach (DataColumn dc in dtEmp.Columns)
{
if (dc.DataType == typeof(System.DateTime))
jsonRowData += "\"" + dc.ColumnName + "\":\"" + Convert.ToString(dr[dc.ColumnName]) + "\"";
else if (dr[dc] != DBNull.Value)
jsonRowData += "\"" + dc.ColumnName + "\":\"" + dr[dc.ColumnName] + "\"";
else
jsonRowData += "\"" + dc.ColumnName + "\":null";
if (dtEmp.Columns.IndexOf(dc) != dtEmp.Columns.Count - 1)
jsonRowData += ",";
}
jsonRowData += "}";
if (dtEmp.Rows.IndexOf(dr) != dtEmp.Rows.Count - 1)
jsonRowData += ",";
}
jsonRowData += "]";
.then(function(response){
var outputarray=JSON.parse(response.data.reportarray);
})