Je reçois une erreur lorsque j'essaie d'utiliser un paramètre Type lors de la spécification du type pour une méthode générique.C# Type de paramètre en tant que déclaration générique
Error: 'JsonFilter.JsonDataType' is a 'property' but is used like a 'type'
public class JsonFilter : ActionFilterAttribute
{
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
JavaScriptSerializer jss = new JavaScriptSerializer();
var result = jss.Deserialize<JsonDataType>(inputContent);//Error here
...
Nouveau Code
...
JavaScriptSerializer jss = new JavaScriptSerializer();
MethodInfo method = jss.GetType()
.GetMethod("Deserialize")
.MakeGenericMethod(new Type[] { JsonDataType });
var result = method.Invoke(jss, new object[] { inputContent });
filterContext.ActionParameters[Param] = result;
...
Réflexion sauve la journée. Merci @Jason pour l'explication que lorsque le type est spécifié dans le cadre de la méthode générique (< Typename>), alors il est compilé en octets. Considérant que, en tant que propriété, elle peut être de n'importe quel type, déterminable uniquement à l'exécution.
MISE À JOUR
Pour ce problème spécifique, le code suivant est plus concis.
var o = new DataContractJsonSerializer(JsonDataType).ReadObject(
filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
je peux être complètement ici hors de la base, mais il semble que vous voulez que la méthode Deserialize générique de travailler avec un type qui est défini au moment de l'exécution ... Je ne sais pas pense que les génériques fonctionnent de cette façon - ils sont gentils et, bien, génériques au moment de la conception, mais ils se compilent en code spécifique au type ... beurk. mon manque de compréhension montre. Bottom line: Je ne pense pas que ce que vous essayez de faire est possible. Vous ne pouvez pas utiliser Generics avec des types affectés par l'exécution. –
Tao
@Tao: Cela peut être fait en utilisant la réflexion. C'est en fait une technique très puissante dans les bonnes circonstances. – jason