C# Type parameter as Generic declaration

c#, generics

Solution

The error

Error: '`JsonFilter.JsonDataType`' is a 'property' but is used like a 'type'

is telling you exactly the problem.

var result = jss.Deserialize<JsonDataType>(inputContent);

Here, you are trying to pass `JsonDataType` as a type parameter to the generic method `JavaScriptSerializer.Deserialize<T>`

but here

public Type JsonDataType { get; set; }

you declared `JsonDataType` as a property of type `Type`, but not as a type. To use a generic method you need to pass a type parameter (or, in some cases, let the compiler infer one). For example

var result = jss.Deserialize<string>(inputContent);

would be correct usage as `string` is a type.

Now, if you absolutely want to use the type that is represented by `JsonDataType` you can use reflection.

MethodInfo generic = typeof(JavaScriptSerializer).GetMethod("Deserialize")
                                                 .GetGenericMethodDefinition();
MethodInfo closed = generic.MakeGenericMethod(new [] { JsonDataType });
closed.Invoke(jss, new object[] { inputContent });

Problem

I am getting an error when trying to use a Type parameter when specifying the Type for a generic method. 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 ... ``` New 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; ... ``` Reflection saves the day. Thanks @Jason for the explanation that when type is specified as part of generic method ( <Typename> ), then it gets compiled into bytes. Whereas when as property, it can be any type, only determinable at runtime. UPDATE For this specific problem, the following code is more concise. ``` var o = new DataContractJsonSerializer(JsonDataType).ReadObject( filterContext.HttpContext.Request.InputStream); filterContext.ActionParameters[Param] = o; ```

Original source