[英]Linq use property name equality
我有一個這樣構造的類,它是從用戶數據源讀取的:
Item
Warehouse
Customer
Forecast_4_2018
Forecast_5_2018
依此類推-我正在使用此數據進行一些計算,並希望動態選擇要在當月使用的“預測”屬性。
int year, int month
PropertyInfo[] properties = typeof(CombinedForecast).GetProperties();
PropertyInfo useThisForecast = null;
foreach (PropertyInfo property in properties)
{
if(property.Name.ContainsAll(year.ToString(), month.ToString()))
{
useThisForecast = property;
}
}
所以在這種情況下useThisForecast == Forecast_4_2018
我有一個LINQ查詢來對數據進行分組並求和數量,但我想指定屬性以按屬性名稱求和。
var results = from a in CombinedForecast
group a by new
{
a.ItemNumber,
a.ShipFromNumber,
a.ShipToNumber
} into grouping
select new SummedOrders
{
SummedQuantity = grouping.Sum(x => x.Forecast_4_2018.Value /*x.GetType().Name.Equals(useThisForecast.Name).Value */ ),
Item = grouping.Key.ItemNumber,
Warehouse = grouping.Key.ShipFromNumber.ParseInt(),
CustomerNumber = grouping.Key.ShipToNumber
};
return results.ToList();
在下面的代碼中,我嘗試使用屬性的名稱而不是對其進行設置,但是我無法正確使用語法。
SummedQuantity = grouping.Sum(x => x.Forecast_4_2018.Value /*x.GetType().Name.Equals(useThisForecast.Name).Value */
您需要使用PropertyInfo.GetValue
方法從適當類型的對象中檢索相應的屬性值:
SummedQuantity = grouping.Sum(x => (dynamic)useThisForecast.GetValue(x));
請注意, GetValue
返回一個可能需要GetValue
的object
-由於我不知道屬性的類型,因此我作弊並使用了dynamic
。
另外,如果您可能要處理字段或屬性,那么MemberInfo
上的某些擴展方法可能會有所幫助:
public static object GetValue(this MemberInfo member, object srcObject) {
switch (member) {
case FieldInfo mfi:
return mfi.GetValue(srcObject);
case PropertyInfo mpi:
return mpi.GetValue(srcObject);
default:
throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
}
}
public static Type GetMemberType(this MemberInfo member) {
switch (member) {
case FieldInfo mfi:
return mfi.FieldType;
case PropertyInfo mpi:
return mpi.PropertyType;
case EventInfo mei:
return mei.EventHandlerType;
default:
throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", nameof(member));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.