用通用操作返回类型调用从通用方法返回的方法

发布于 2025-02-10 09:01:41 字数 3393 浏览 1 评论 0原文

嗨,我有快速调用的课程

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

,我需要执行builduntypedsetter带有参数的方法(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");

这是可能的吗?

编辑以添加: 我尝试了。有可能吗?

method.Invoke(null, new[] { prop }).GetType().GetMethods()[0].Invoke(method.Invoke(null, new[] { prop }).GetType().GetMethods()[0].DeclaringType.Name,new[]{obj,"1"})

我有错误:

对象与目标类型不匹配。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北城孤痞 2025-02-17 09:01:41

感谢您花宝贵的时间伴侣。我通过返回JSON字符串并使用JSON.PARSE()在然后函数来克服这一点。

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

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);
})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文