Тип универсального метода T — это тип ограничения, а не реальный тип переданного объекта

У меня есть этот общий метод с ограничением для ILogicPointContext. Этот метод вызывает другие универсальные методы с тем же ограничением, но код выдает исключение, поскольку мне нужен правильный тип, а не тип интерфейса.

public void DoSomething<TContext>(TContext ctx)
    where TContext : ILogicPointContext
{
    var typeOfCtx = ctx.GetType();  // CcpContex
    var typeOfT = typeof(TContext); // ILogicPointContext
    ...

У меня есть еще один аналогичный метод, где общий тип метода является общим типом объекта, который я ему передаю, и это отлично работает.

private void InsertStepDefinition<TContext>(PipelineStepDefinition<TContext> stepInfo)
    where TContext : ILogicPointContext

В этом случае TContext — это не интерфейс, а правильный тип.

Что мне не хватает?

Кто кому звонит?

Jeroen van Langen 08.04.2022 09:40

Может быть PipelineStepDefinition<TContext>, который должен быть TContext, или наоборот.

lidqy 08.04.2022 09:44

Каков тип и сообщение выброшенного исключения и какова причина его выбрасывания? Если метод имеет ограничение универсального типа, но во время выполнения у него есть дополнительные ограничения на тип, вы должны проверить сообщение и код, чтобы выполнить эти ограничения. Мы не можем помочь, потому что не знаем вашего кода.

Oliver 08.04.2022 09:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Универсальный разрешается автоматически при вызове с переменными типами (без вызова метода с <>).

Пример:

void Main()
{
    Foo var1 = new Foo();
    ILogicPointContext var2 = var1;
    
    DoSomething(var1); //outputs Foo: generic resolution is automatically done on variable type
    DoSomething(var2); //outputs ILogicPointContext, for the same reason
}



interface ILogicPointContext{}
class Foo:ILogicPointContext{}

void DoSomething<TContext>(TContext ctx)
    where TContext : ILogicPointContext
{    
    Console.WriteLine(typeof(TContext).Name);
}

Второй вывод - это фактический тип TContext, тип, с которым "создается" универсальный тип и который используется в методе.

Спасибо, проблема была в том, что контекст был получен с помощью этого метода LogicPointContext GetContext(string logicPointCode). Использование TContext GetContext<TContext>(string logicPointCode) where TContext : ILogicPointContext решило проблему. Проблема в том, что я должен знать тип заранее

LMio 08.04.2022 10:08

Это имеет смысл. Если вы абсолютно уверены, что результатом является CcpContex, вы можете сначала привести его к единице, но это может привести к ошибкам во время выполнения. Если действительно необходимо знать фактический тип объекта, gettype(), вероятно, безопаснее. Из любопытства, зачем вам точный тип?

Me.Name 08.04.2022 10:13

У меня есть этот словарь, в котором хранятся конфигурации для построения конвейера, и, поскольку в приложении есть разные типы контекста, я решил использовать имя типа в качестве ключа словаря для этих настроек.

LMio 08.04.2022 11:19

Другие вопросы по теме