我创建了一个这样的类型:
TypeBuilder tb = moduleBuilder.DefineType(myname, TypeAttributes.Class |
TypeAttributes.Public, typeof(BaseClass), new Type[] { typeof(ImyInterface) });
然后为构造函数,方法等提供了大量的生成代码。 当我开始使用课程时,我发现了一些奇怪的东西。我想检查我创建的类型'myname'是否真的实现了ImyInterface。我希望以下两个语句都返回true:
// 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);
}
答案 0 :(得分:2)
我终于发现了我所缺少的内容:无论何时检查类型兼容性以及您在不同项目/程序集中定义的类型和接口之间的可分配性,都要确保所有项目都已签名并强烈命名!否则GetInterface方法将起作用,因为它只是比较名称。但.net不会在类型之间分配。
答案 1 :(得分:1)
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);
}
}
}
这是有效的,所以我想问题是你没有在这里发布的代码中的某个地方
编辑:更新,以便IMyInterface现在在另一个项目中,并且仍可正常工作