Я, возможно, совершенно не понял вопроса, но я просто смотрю пример кода и комментарии здесь ...
public Type GetRequestType()
{
return /* ....... how to get the Type of T? ((new T()).GetType()) ? */
}
Вы действительно пытаетесь получить тип времени выполнения параметра типа T
? Если так, то просто используйте typeof
.
public Type GetRequestType()
{
return typeof(T);
}
Имейте в виду, я смотрю позже на этот другой код:
class Controller
{
public ProcessRequest(String action, String serializedRequest)
{
IHandler handler = GetHandlerForAction(action);
IRequest request =
serializer.Deserialize<handler.GetRequestType()>(serializedRequest);
handler(this.Model, request);
}
}
Вы не можете этого сделать. Вы не можете просто вставить туда Type
как параметр общего типа, он не скомпилируется. Если у вас есть фактический экземпляр времени выполнения Type
, который необходимо использовать в качестве универсального параметра, то единственный способ сделать это с помощью отражения:
Type serializerDef = typeof(MySerializer<>);
Type serializerType = serializerDef.MakeGenericType(requestType);
MethodInfo method = serializerType.GetMethod("Deserialize",
BindingFlags.Instance | BindingFlags.Public);
IRequest request = (IRequest)method.Invoke(serializer, serializedRequest);
Это довольно уродливо, но так происходит, когда вы пытаетесь смешивать универсальные типы с отражением.
О, и это предполагает, что сам "сериализатор" является универсальным типом; если вы пытаетесь вызвать универсальный метод для неуниверсального типа , как предполагает оригинальный код, то это становится намного более громоздким.