反思親愛的神泛型方法來獲得屬性值的LINQ表達和思考
我想有一個通用的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; }
}
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);
到目前爲止,我有以下的實現方法具:什麼GetValue<TEntity, T>
應該能夠做到
用法示例d其中工程前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?什麼樣的?你想在哪裏得到這個?我認爲你是過於複雜的事情。 – Lidaranis
@DStanley它運行但最後3拋出錯誤。看到我編輯的答案 –