用通用操作返回类型调用从通用方法返回的方法
嗨,我有快速调用的课程
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
感谢您花宝贵的时间伴侣。我通过返回JSON字符串并使用JSON.PARSE()在
然后
函数来克服这一点。Thanks for spending your valuable time mates. I overcome this by returning a JSON string and parsing it using JSON.parse() at
then
function