【发布时间】:2016-10-26 23:08:55
【问题描述】:
亲爱的反射之神
我想要一个通用的GetValue<TEntity, T> 方法,它可以在给定以下User 类的情况下返回以下属性值:
public class User
{
public int Id { get; set; }
public int ClientId { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MobileNumber { get; set; }
public bool IsActive { get; set; }
public Client Client { get; set; }
public List<Package> Packages { get; set; }
}
GetValue<TEntity, T> 应该能够做什么的示例用法:
var firstName = dataCollector.GetValue<User, string>(x => x.FirstName);
var client = dataCollector.GetValue<User, Client>(x => x.Client);
var packages = dataCollector.GetValue<User, List<Package>>(x => x.Packages);
var packageFirst = dataCollector.GetValue<User, Package>(x => x.Packages[0]);
var packageName = dataCollector.GetValue<User, string>(x => x.Packages[0].Name);
var clientName = dataCollector.GetValue<User, string>(x => x.Client.Name);
到目前为止,我有以下方法适用于前 3 个场景:
public T GetValue<TEntity, T>(Expression<Func<TEntity, T>> propertyExpression) where TEntity : class
{
var response = _responses.FirstOrDefault(p => p.GetType() == typeof(TEntity)) as TEntity;
if (response != null)
{
var expr = (MemberExpression)propertyExpression.Body;
var prop = (PropertyInfo)expr.Member;
return (T)prop.GetValue(response);
}
return default(T);
}
但它不适用于最后 3 个场景:
var packageFirst = dataCollector.GetValue<User, Package>(x => x.Packages[0]);
抛出:Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpressionN' to type 'System.Linq.Expressions.MemberExpression'.
var packageName = dataCollector.GetValue<User, string>(x => x.Packages[0].Name);
抛出:Object does not match target type.
var clientName = dataCollector.GetValue<User, string>(x => x.Client.Name);
抛出:Object does not match target type.
我需要对方法进行哪些更改?
我现在将在等待您的回答的同时牺牲一个 USB 闪存驱动器:)
【问题讨论】:
-
“不起作用”是什么意思?不编译?错误信息?如果
x.Packages为空或 null,或者如果x.Client为 null,您将收到运行时错误。 -
我们需要更多的答案:谁是 dataCollector?哪种类型?你想在哪里得到这个?我认为你把事情复杂化了。
-
@DStanley 它运行但最后 3 次抛出错误。查看我编辑的答案
标签: c# generics reflection linq-expressions