Avoiding boxing (causing many small allocations) in generic classes - C#