Здравствуйте.
В определенном случае не происходит преобразование (cast) интерфейса в класс.
Для начала типовой рабочий пример:
Есть интерфейс, есть реализующий класс, есть еще один класс со статическим методом, который на вход получает интерфейс и через рефлексию получает имя класса. Так же этот метод выполняет приведение интерфейса к типу и обращается к свойству, определенному в типе.
public interface ITest { }
public class CTest : ITest
{
public string Message { get; set; }
}
public class Testing
{
public static void DoIt(ITest t)
{
Console.WriteLine(t.GetType().Name);//->CTest
CTest ct = (CTest)t;
Console.WriteLine(ct.Message);//->test message
}
}
В методе Main консольного приложения вызывается такой код:
CTest t=new CTest(){ Message = "test message"};
Testing.DoIt(t);
результат ожидаем:
CTest
test message
---------------------
Теперь странный пример, объяснить который я прошу.
Есть Nuget пакет MassTransit (7.3.0) (
https://github.com/MassTransit/MassTransit)
Там есть интерфейс Fault, от него унаследован
Fault<out T>
, от него унаследован класс
FaultEvent<T>
где-то в недрах кода инстанциируется класс (мы же не можем создать объект интерфейса) и затем он передается в качестве входного параметра в мой метод:
public Task Consume(ConsumeContext<Fault> context)
{
Fault m = context.Message;
string typename = m.GetType().FullName;
}
В переменной typename оказывается значение: "GreenPipes.DynamicInternal.MassTransit.Fault", т.е. значение интерфейса, а не класса. Получается что этому коду удалось таки создать объект интерфейса.
Может ли кто-то объяснить, как такое возможно?
Спасибо.