Почему IsAssignableFrom и GetInterface дают разные результаты - PullRequest
5 голосов
/ 27 июля 2010

Я создал такой тип:

TypeBuilder tb = moduleBuilder.DefineType(myname, TypeAttributes.Class |
      TypeAttributes.Public, typeof(BaseClass), new Type[] { typeof(ImyInterface) });

Затем следует множество порождающего кода для конструкторов, методов и т. Д. Когда я начал использовать класс, я заметил что-то странное. Я хочу проверить, действительно ли созданный мной тип 'myname' реализует ImyInterface. Я ожидаю, что оба из следующих утверждений вернут истину:

// t is Type 'myName'
Type baseInterface = t.GetInterface(typeof(ImyInterface).name);   
if (baseType != null)
{
  // this is actually true, as I expected
}

if (typeof(ImyInterface).isAssignableFrom(t))
{
  // the if clause is false, but I don't have a clue why??
}

Итак, я создал класс, который реализует ImyInterface, но который нельзя назначить объекту типа ImyInterface, что мне не хватает?

Между прочим, здесь не используются общие шаблоны, а интерфейс является лишь базовым для проверки концепции:

public interface ITestInterface
{
    int CalcSquaredInteger(int number);
}

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Я наконец-то выяснил, чего мне не хватало: всякий раз, когда вы проверяете совместимость типов и присваиваемость между типами и интерфейсами, которые вы определили в разных проектах / сборках, убедитесь, что все ваши проекты подписаны и строго названы !!В противном случае метод GetInterface будет работать, потому что он просто сравнивает имя.Но .net не будет назначать между типами.

1 голос
/ 27 июля 2010
using ClassLibrary1; // this is another project that contains IMyInterface

namespace ConsoleApplication1
{
    public class MyBaseClass
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyReflectionTest(typeof(ClassLibrary1.IMyInterface));
        }

        private static void MyReflectionTest(Type interfaceType)
        {

            AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.RunAndSave);

            ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");

            TypeBuilder tb = mb.DefineType("MyDynamicType", TypeAttributes.Public, typeof(MyBaseClass), new Type[] { interfaceType });

            MethodBuilder mbIM = tb.DefineMethod("IMyInterface.MyTestMethod", MethodAttributes.Private | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final, null, Type.EmptyTypes);
            ILGenerator il = mbIM.GetILGenerator();
            il.Emit(OpCodes.Ret);

            tb.DefineMethodOverride(mbIM, interfaceType.GetMethod("MyTestMethod"));

            var myType = tb.CreateType();

            Debug.Assert(interfaceType.IsAssignableFrom(myType) == true);
        } 
    }
}

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

edit: обновлено, поэтому IMyInterface теперь находится в другом проекте и все еще работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...