Я получаю ошибку при попытке использовать параметр Типа при определении Типа для общего метода.
Ошибка: 'JsonFilter. JsonDataType' является 'свойством', но используется как 'тип'
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
...
Новый код
...
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;
...
Отражение спасает положение. Спасибо @Jason для объяснения, что, когда тип указан как часть общего метода (<Имя типа>), затем это компилируется в байты. Принимая во внимание, что, когда как свойство, это может быть любой тип, только определимый во времени выполнения.
ОБНОВЛЕНИЕ
Для этой определенной проблемы следующий код более краток.
var o = new DataContractJsonSerializer(JsonDataType).ReadObject(
filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
Звонки в прямом эфире () с такими событиями, как изменение, для меня очень важны. Я хотел этого как-то сейчас.
-121--1002646- Вы можете обойти это, используя Detours , обернув LoadLibrary
.
Оболочка LoadLibrary сможет распознавать попытки загрузки библиотеки DLL и соответствующим образом переписывать путь.
Ошибка
Ошибка: '
JsonFilter.JsonDataType
' является свойством ', но используется как' type '
говорит вам точно о проблеме.
var result = jss.Deserialize<JsonDataType>(inputContent);
Здесь вы пытаетесь передать JsonDataType
в качестве параметра типа универсальному методу JavaStartSerializer.Deserialize < T >
, но здесь
public Type JsonDataType { get; set; }
вы объявили JsonDataType
как свойство типа Type
, но не как тип. Для использования общего метода необходимо передать параметр типа (или, в некоторых случаях, пусть компилятор выведет один). Например,
var result = jss.Deserialize<string>(inputContent);
будет правильным, так как последовательность
является типом.
Теперь, если вы абсолютно хотите использовать тип, который представлен JsonDataType
, вы можете использовать отражение.
MethodInfo generic = typeof(JavaScriptSerializer).GetMethod("Deserialize")
.GetGenericMethodDefinition();
MethodInfo closed = generic.MakeGenericMethod(new [] { JsonDataType });
closed.Invoke(jss, new object[] { inputContent });
Поскольку вы не можете добавить параметр универсального типа на ваш класс, то вам нужно будет использовать отражение:
public class JsonFilter : ActionFilterAttribute
{
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// ...
JavaScriptSerializer jss = new JavaScriptSerializer();
MethodInfo method = jss.GetType()
.GetMethod("Deserialize");
.MakeGenericMethod(new Type[] { JsonDataType });
var result = method.Invoke(jss, new object[] { inputContent });
//...
}
}
Оригинал, неверный ответ ...
Можете ли вы использовать универсальный Тип параметра вместо свойства jsondatatype
jsondataType ?
public class JsonFilter<TJsonData> : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// ...
JavaScriptSerializer jss = new JavaScriptSerializer();
var result = jss.Deserialize<TJsonData>(inputContent);
//...
}
}
Попробуйте это что-то вдоль этих строк. Я обновим его для вашего кода в секунду.
typeof(IDependencyResolver).GetMethod("Resolve", new Type[] { })
.MakeGenericMethod(type)
.Invoke(this, null);
Вот грубый проект для вас.
typeof(JavaScriptSerializer).GetMethod("Deserialize", new Type[] {} /* param types */)
.MakeGenericMethod(JsonDataType).Invoke(jss, /*params*/);
В основном он использует отражение, чтобы вызвать универсальный метод.
Вы не можете пройти аргумент общих типов таким образом - попробуйте что-то вроде этого:
public class JsonFilter<T> : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
var result = jss.Deserialize<T>(inputContent);//Error here
}
}
, а не установить тип в свойстве, сделайте свой JSONFILTER
Class Generic, чтобы вы могли пройти универсальный тип Аргумент до к Javascripterializer
.