Tengo una clase que tiene una docena o más de propiedades que representan varios campos financieros. Tengo otra clase que necesita realizar algunos cálculos en cada uno de esos campos por separado. El código dentro de esos métodos de cálculo es idéntico, excepto por el campo en el que realiza el cálculo.¿Cómo puedo pasar una propiedad de una clase como parámetro de un método?
¿Hay alguna manera de que pueda pasar un nombre de propiedad como parámetro y tener solo un método que haga todo el trabajo de interpretación en lugar de los 12 métodos para cada propiedad?
Además, estoy seguro de que esto se puede lograr a través de la reflexión, pero he visto en otro código que las lambdas se usan de la misma manera y me pregunto si este es un candidato donde se puede usar.
Conforme a lo solicitado, aquí es un ejemplo:
public class FinancialInfo
{
public virtual DateTime AuditDate { get; set; }
public virtual decimal ReleasedFederalAmount { get; set; }
public virtual decimal ReleasedNonFederalAmount { get; set; }
public virtual decimal ReleasedStateAmount { get; set; }
public virtual decimal ReleasedLocalAmount { get; set; }
public virtual decimal ReleasedPrivateAmount { get; set; }
// more fields like this
}
public class FinancialLedger()
{
public virtual DateTime? BeginDate { get; set; }
public virtual DateTime? EndDate { get; set; }
public virtual IList<FinancialInfo> Financials { get; set; } //not actual implementation, but you get the idea
public decimal GetTotalReleasedFederalAmountByDate()
{
if (BeginDate == null && EndDate == null)
return 0;
decimal total = 0;
foreach (var fi in Financials)
{
if (someCondition)
if (someSubCondition)
total += fi.ReleasedFederalAmount;
else if (someOtherCondition)
if (someOtherSubCondition)
total += fi.ReleasedFederalAmount;
else if (anotherCondigion)
total += fi.ReleasedFederalAmount;
}
return total;
}
public decimal GetTotalReleasedNonFederalAmountByDate()
{
// same logic as above method,
// but it accesses fi.ReleasedNonFederalAmount;
}
// More methods the same as the previous, just accessing different
// members of FinancialInfo
}
Mi objetivo es simplemente hacer un método llamado GetTotalAmountByDate() y pasar de una fecha de inicio y fecha de finalización y el nombre de la propiedad (ReleasedFederalAmount o ReleasedLocalAmount, etc.) necesita acceder.
Espero que esto represente con precisión lo que estoy tratando de lograr.
Será más fácil de responder si se puede compartir una ejemplo de tal función, y una idea de cómo se verían las propiedades de la clase. –
Tengo curiosidad por saber por qué su método de cálculo no puede tomar, por ejemplo, la instancia de la clase de campos financieros, y un valor (es decir, el valor de la propiedad sobre la que desea realizar el cálculo) como parámetros. ¿Puedes publicar algún código auxiliar para iluminar tu pregunta? –
use el mismo tipo en la definación de su función, que utilizó en la propiedad de la clase. –