Это грязная вещь, и я чувствую себя грязной из-за этого:
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
с соответствующей сигнатурой для работы вышеупомянутого отражения.
Использование отражения для вызова статического метода, который даже не гарантированно присутствует в производном классе, просто пахнет. Есть ли лучший способ справиться с этим?