簡體   English   中英

Linq使用屬性名稱相等

[英]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返回一個可能需要GetValueobject -由於我不知道屬性的類型,因此我作弊並使用了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM