В подобных случаях я использую словари, соединенные со значениями лямбда-выражений, подходящими для конкретной задачи.
var options = new Dictionary<Type, Action>()
{
{ typeof(string), () => doSomething() },
{ typeof(int), () => doSomething() },
...
};
Action act = null;
if (options.TryGetValue(typeof(T), out act) {
act();
} else {
// default
}
Словарь обычно представляет собой поле или свойство static readonly
, поэтому индексированиеделается только один раз.
В вашем конкретном случае вы можете получить вместе с Dictionary<Type, Func<object, string>>
, вот так:
private static readonly Formatters = new Dictionary<Type, Func<object, string>>()
{
{ typeof(Class1), o => ((Class1)o).format() },
{ typeof(Class2), o => FormatClass.FormatClass2((Class2)o) },
...
};
T instance;
string formatted = Formatters[typeof(T)](instance);