.NET: Неспособный бросить объект взаимодействовать через интерфейс это реализует

У меня есть класс (TabControlH60), который и наследовался базовому классу (UserControl) и реализует интерфейс (IFrameworkClient). Я инстанцирую объекта с помощью класса Активатора.NET. С возвращенным экземпляром я могу бросить к базовому классу UserControl, но не к интерфейсу. Исключение, которое я получаю, ниже отрывка кода. Как я бросаю к интерфейсу?

object obj = Activator.CreateInstance(objType);
Type[] interfaces = obj.GetType().GetInterfaces(); // contains IFrameworkClient

m_Client = (UserControl)obj;                 // base class cast works
IFrameworkClient fc = (IFrameworkClient)obj; // interface cast fails

// Note: The (IFrameworkClient)obj cast works fine in the debugger Watch window.
{"Unable to cast object of type 'FPG.H60.AFF.TabControlH60' to type 
    'FPG.AFF.Interfaces.IFrameworkClient'."}
23
задан Ryan Lundy 20 October 2009 в 19:32
поделиться

5 ответов

Я столкнулся с той же проблемой, и я просто добавил следующий код

private void LoadAssemblyPlugins(string dll)

    Assembly ass = AppDomain.CurrentDomain.GetAssemblies()
        .FirstOrDefault(a => new Uri(a.CodeBase).Equals(new Uri(dll)));

   if (ass == null)
       // Load it here
       // use activator here

, Хотя, в производстве это никогда не будет проблема, в модульном тесте это было слишком теперь, я не должен загрузить его снова и создать "другой тип"

0
ответ дан 28 November 2019 в 22:45
поделиться

Наиболее вероятный Причина в том, что IFrameworkClient в обоих случаях принадлежит другой сборке и, следовательно, является другим типом .NET. Даже если это один и тот же код, он может быть другого типа.

Проверьте AssemblyQualifiedName . Также обратите внимание, что если вы загружаете эту сборку с отражением, вы можете получить другой тип даже с тем же AssemblyQualifiedName , благодаря load-context.

11
ответ дан 28 November 2019 в 22:45
поделиться

Something tells me your sample code is leaving some stuff out...

class Program
{
    static void Main(string[] args)
    {
        var type = typeof(MyClass);
        object obj = Activator.CreateInstance(type);
        Type[] interfaces = obj.GetType().GetInterfaces();

        var m_Client = (UserControl)obj;          
        IFrameworkClient fc = (IFrameworkClient)obj;
    }
}

public interface IFrameworkClient { }

public class UserControl { }

public class MyClass : UserControl, IFrameworkClient { }

This compiles and runs.

I'm betting that the DLL containing the definition of IFrameworkClient hasn't yet been loaded before you try to cast. This can happen when you're using Activator.CreateInstance.

Try inserting var forceLoad = typeof(IFrameworkClient); before the cast.

3
ответ дан 28 November 2019 в 22:45
поделиться

If the class FPG.H60.AFF.TabControlH60 actually does implement IFrameworkClient there should be no reason this would fail. The only thing I can think of that causes this exception is if the assembly that contains IFrameworkClient is strongly named and the Tab Control object happens to reference a different version of the containing assembly or your are using a different interface with the name IFrameworkClient.

0
ответ дан 28 November 2019 в 22:45
поделиться

The cast isn't working because you're trying to cast from type object to the interface. If you replace the interface cast line with:

IFrameworkClient fc = (IFrameworkClient)m_Client;

It will work.

Alternately, I'm mildly certain that you could do the cast from the object to the interface with the as operator.

See this article for more information: http://blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

Еще одна часть головоломка. Интерфейсы не являются производными от объекта : http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx

-1
ответ дан 28 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

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