简体   繁体   中英

Invoke a method returned from generic method with generic Action return type

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);
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM