У меня есть этот общий метод с ограничением для 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 — это не интерфейс, а правильный тип.
Что мне не хватает?
Может быть PipelineStepDefinition<TContext>
, который должен быть TContext
, или наоборот.
Каков тип и сообщение выброшенного исключения и какова причина его выбрасывания? Если метод имеет ограничение универсального типа, но во время выполнения у него есть дополнительные ограничения на тип, вы должны проверить сообщение и код, чтобы выполнить эти ограничения. Мы не можем помочь, потому что не знаем вашего кода.
Универсальный разрешается автоматически при вызове с переменными типами (без вызова метода с <>).
Пример:
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
решило проблему. Проблема в том, что я должен знать тип заранее
Это имеет смысл. Если вы абсолютно уверены, что результатом является CcpContex
, вы можете сначала привести его к единице, но это может привести к ошибкам во время выполнения. Если действительно необходимо знать фактический тип объекта, gettype(), вероятно, безопаснее. Из любопытства, зачем вам точный тип?
У меня есть этот словарь, в котором хранятся конфигурации для построения конвейера, и, поскольку в приложении есть разные типы контекста, я решил использовать имя типа в качестве ключа словаря для этих настроек.
Кто кому звонит?