Это грязный поступок, и я чувствую себя грязным за это:
public abstract class InterestRate {
// irrelevant details
public static T ImpliedRate<T>(
double factor,
double time,
DayCounter dayCounter
) where T : NonCompoundedInterestRate {
MethodInfo methodInfo = typeof(T).GetMethod(
"ImpliedRate",
BindingFlags.Static);
return (T)methodInfo.Invoke(
null,
new object[] { factor, time, dayCounter }
);
}
public static T ImpliedRate<T>(
double factor,
double time,
DayCounter dayCounter,
Frequency frequency
) where T : CompoundedInterestRate {
MethodInfo methodInfo = typeof(T).GetMethod(
"ImpliedRate",
BindingFlags.Static);
return (T)methodInfo.Invoke(
null,
new object[] { factor, time, dayCounter, frequency }
);
}
Здесь у меня есть классы NonCompoundedInterestRate
(абстрактный) и CompoundedInterestRate
, производные от абстрактного класса InterestRate
. У меня есть несколько конкретных реализаций NonCompoundedInterestRate
, которые имеют статические методы с именем ImpliedRate
с соответствующей сигнатурой для работы вышеуказанного отражения.
Использование отражения для вызова статического метода, наличие которого даже не гарантируется в производном классе, просто отвратительно. Есть ли лучший способ справиться с этим?