Используя метод параметризованного типа с областью действия:
public <T> T get(Class<T> key) {
// ...
return (T) foo;
}
Здесь я предполагаю, что foo
не имеет тип T
.
Если он уже набран как T
, вы, конечно, можете вернуть его без приведения.
Вы могли бы вызвать это:
IRouter router = container.get(IRouter.class);
Осторожность: Этот ответ, кажется, устарел. Это было отправлено, прежде чем.NET 4 стала доступной, который, по-видимому, представил некоторую оптимизацию относительно
Type
и таким образом представил информацию в этом устаревшем ответе. См. этот более свежий ответ для деталей.
Согласно это сообщение в блоге (с 2006) Vance Morrison , RuntimeTypeHandle
является типом (struct
) значения, который переносит неуправляемый указатель, таким образом Type.GetTypeHandle(obj).Equals(anotherHandle)
быстрее для использования для строгого, "точно тот же тип" сравнения, чем obj.GetType().Equals(anotherType)
— последний создает System.Type
экземпляры, которые, по-видимому, более тяжелы.
Однако это также менее очевидно, и определенно подпадает под категорию "микрооптимизация" поэтому, если Вы задаетесь вопросом, когда Вам нужно один по другому, необходимо, вероятно, просто использовать Систему. Ввести.
В .NET 4.0 Beta 1 RuntimeTypeHandle
просто обертывает RuntimeType
.
Похоже, что все преимущества его использования в качестве дешевого прокси Type
исчезли.
System.RuntimeTypeHandle
type показывает, что в наши дни этот тип действительно является лишь оболочкой для System.RuntimeType
. RuntimeTypeHandle
исчезли в .NET 4.