Параметр Типа C# как Универсальное объявление

Я получаю ошибку при попытке использовать параметр Типа при определении Типа для общего метода.

Ошибка: '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;
5
задан Greg Ogle 21 January 2010 в 22:21
поделиться

4 ответа

Звонки в прямом эфире () с такими событиями, как изменение, для меня очень важны. Я хотел этого как-то сейчас.

-121--1002646-

Вы можете обойти это, используя Detours , обернув LoadLibrary . Оболочка LoadLibrary сможет распознавать попытки загрузки библиотеки DLL и соответствующим образом переписывать путь.

-121--2270259-

Ошибка

Ошибка: ' 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 });
14
ответ дан 18 December 2019 в 06:50
поделиться
[11385817-

Поскольку вы не можете добавить параметр универсального типа на ваш класс, то вам нужно будет использовать отражение:

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);
        //...
    }
}

5
ответ дан 18 December 2019 в 06:50
поделиться

Попробуйте это что-то вдоль этих строк. Я обновим его для вашего кода в секунду.

typeof(IDependencyResolver).GetMethod("Resolve", new Type[] { })
                .MakeGenericMethod(type)
                .Invoke(this, null);

Вот грубый проект для вас.

typeof(JavaScriptSerializer).GetMethod("Deserialize", new Type[] {} /* param types */)
    .MakeGenericMethod(JsonDataType).Invoke(jss, /*params*/);

В основном он использует отражение, чтобы вызвать универсальный метод.

2
ответ дан 18 December 2019 в 06:50
поделиться

Вы не можете пройти аргумент общих типов таким образом - попробуйте что-то вроде этого:

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 .

2
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: