【发布时间】:2017-07-14 17:57:21
【问题描述】:
我是反思的新手,希望你能帮助我。我发现了很多与我类似的问题,但没有在我的问题中得到传播。
我有一个方法:
IEnumerable<TEntity> Get<TEntity>(Expression<Func<TEntity, object>> propertyNameExpression, object propertyValue) where TEntity : NT.Base.Framework.ODL.Entity;
我通常这样称呼这个方法:
PersistentService.Get<Agent>(a => a.ID, Guid.Empty);
但现在我只在运行时知道我有哪个类。所以我有一个
Type classType;
并且需要知道如何用classType调用这个方法。我有一个临时解决方案,我采用带有字符串的方法,但代码中的硬编码字符串不太好。
MethodInfo methodInfo = typeof(PersistenceService).GetMethod("Get", new Type[] { classType, typeof(string) });
var classMethod = methodInfo.MakeGenericMethod(classType);
string query = "SELECT * FROM " + classType.Name + " WHERE " + classType.Name + ".Id = '" + pg.GUID.ToString() + "'";
dynamic dEnumeration = classMethod.Invoke(PersistenceService, new object[] { query });
dynamic dEntity = Enumerable.FirstOrDefault(dEnumeration);
编辑:我尝试了以下方法,但 methodInfo 始终为 NULL
ParameterExpression parameter = Expression.Parameter(typeof(Entity), "a");
var delegateType = typeof(Func<,>).MakeGenericType(typeof(Entity), typeof(object));
var yourExpression = Expression.Lambda(delegateType, parameter, parameter);
MethodInfo methodInfo = typeof(PersistenceService).GetMethod("Get", new Type[] { yourExpression.GetType(), typeof(object) });
yourExpression.GetType() 的类型是:
{Name = "Expression`1" FullName = "System.Linq.Expressions.Expression`1[[System.Func`2[[NT.Base.Framework.ODL.Entity, NT.Base.Framework.ODL, Version=0.0.0.126, Culture=neutral, PublicKeyToken=null],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"} System.Type {System.RuntimeType}
所以请帮助我,如何获取和调用此方法。
【问题讨论】:
-
您需要使用
ExpressionAPI 来构建表达式树。 -
我编辑了这个问题,我尝试了什么,但它并没有解决我的问题。
标签: c# reflection expression func