Предположим, что у меня есть некоторый класс, который вызывает Func
, основанный на родовом типе переданного ему, и у меня есть нужный общедоступный интерфейс для этого класса что-то вроде этого:Как избежать бокс типов значений
var r = new Resolver();
var i = r.Invoke(10); // invokes some function `Func<int,int>`
var j = r.Invoke("Hello"); // Same, but `Func<string,string>`
var k = r.Invoke(10, 10); // Same but 'Func<int,int,int>`
I есть реализация так:
class Resolver {
readonly IDictionary<Type, Func<object, object>> _funcs = new Dictionary<Type, Func<object, object>>();
public Resolver() {
_funcs.Add(typeof(int), o => (int)o*(int)o);
_funcs.Add(typeof(string), o => (string)o + (string)o);
// and so on;
}
public T Invoke<T>(T t1) {
return (T) _funcs[typeof (T)](t1);
}
public T Invoke<T>(T t1, T t2) {
return (T)_funcs[typeof(T)](t1);
}
}
но производительность ужасна для типов значений из-за бокс, вызванным внутренним осуществлением Func<,>
object
, имеющими в качестве родовых типов.
Есть ли способ реализовать мой желаемый публичный интерфейс, избегая бокса для типов значений? Я также не буду возражать против безопасности статического типа внутри реализации, но без него.
Это отличный способ избежать моей предполагаемой проблемы. Тем не менее, это ясно, основываясь на моем собственном тестировании, что бокс не является основной причиной проблемы производительности, которую я испытываю. Тем не менее, я ценю ответ. Спасибо! – jdphenix