Сделайте ваши методы общими, и вы хороши.
Обратите внимание, что у вас всегда есть выбор использования всех аргументов универсального типа в функции, если это необходимо, например:
public void MyMethod<TUniform, T>(TUniform uniform) where TUniform: Uniform<T> {...}
Компилятор обычно выводит аргументы типа самостоятельно, когда у вас есть параметр, так что вызов на самом деле выглядит как обычный вызов метода в исходном коде C #:
UniformMatrix4 uniform;
MyMethod(uniform); // the types of the generic functions are inferred