Отражение в C#: группирование свойств и вычисление суммы других свойств - PullRequest
0 голосов
/ 16 июня 2020

Итак, у меня есть такой класс:

 public class PaymentsModel
    {
        [ReportsSummary(isGroupingSource:true)]
        public string PaymentType { get; set; }

        [ReportsSummary(isGroupingTarget: true)]
        public double Amount { get; set; }

        public string GuestName { get; set; }
}

У меня есть List of (generi c), который содержит разные объекты с разными значениями, например:

{"Bank", 1, "K"},
{"Card", 2, "C"},
{"Cash", 3, "D"},
{"Bank", 2, "E"},
{"Card", 3, "G"},

I нужен метод CalculateSum (), который будет использовать generi c класс и отражение и возвращать Dictionary с группировкой по PaymentType и суммировать Amount для каждого PaymentType. Итак, результат должен быть:

[{"Bank", 3},
{"Card", 5},
{"Cash", 5}]

Я создал атрибут, чтобы понять, какие свойства следует сгруппировать, а какие - суммировать:

 class ReportsSummaryAttribute : Attribute
    {
        public bool IsGroupingSource { get; private set; }
        public bool IsGroupingTarget { get; private set; }

        public ReportsSummaryAttribute(bool isGroupingSource = false, bool isGroupingTarget = false)
        {
            IsGroupingSource = isGroupingSource;
            IsGroupingTarget = isGroupingTarget;
        }
    }

Но не понимаю, как создать правильный метод.

1 Ответ

0 голосов
/ 16 июня 2020

возможное решение, которое вы можете адаптировать:

public class MyGenericClass<T> where T:PaymentsModel//or common baseType
{

    public Dictionary<string, double> genericMethod(List<T> source)
    {
        var result = source.GroupBy(x => x.PaymentType)
            .Select(t => new { PaymentType = t.Key, Total = t.Sum(u => u.Amount) })
            .ToDictionary(t => t.PaymentType, t => t.Total);
        return result;
    }
}
:
:
//in processus
var myGenericClass = new MyGenericClass<PaymentsModel>();
var result = myGenericClass.genericMethod(source);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...