gpt4 book ai didi

c# - 使用 Reflection.Emit 实现泛型接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 23:15:12 26 4
gpt4 key购买 nike

我正在使用 Reflection.Emit定义一个新类型,我希望该类型实现 IComparable(T) ,其中 T 将是新定义的类型。

class DefinedType : IComparable<DefinedType>
{
//...
}

在我看来,我遇到了先有鸡还是先有蛋的问题。

作为回退,我总是可以只实现IComparable,但如果可能的话我想要通用接口(interface);我只是看不出如何使用 Emit 来完成它,因为在我定义它之前该类型不存在。

最佳答案

这应该有效:

var tb = mb.DefineType("Test", TypeAttributes.Public);
var iface = typeof(IComparable<>).MakeGenericType(tb);
tb.AddInterfaceImplementation(iface);

var meb = tb.DefineMethod("CompareTo", MethodAttributes.Public | MethodAttributes.Virtual, typeof(int), new [] { tb } );
var il = meb.GetILGenerator();
il.ThrowException(typeof(Exception));

var type = tb.CreateType();

幸运的是,TypeBuilder 继承自 Type,因此您可以在 MakeGenericType 中使用它。

作为验证,这有效:

var o1 = Activator.CreateInstance(type);
var o2 = Activator.CreateInstance(type);

typeof(IComparable<>).MakeGenericType(o1.GetType()).GetMethod("CompareTo").Invoke(o1, new [] { o2 }).Dump();

您不必以任何方式将生成的方法绑定(bind)到接口(interface),只要它们的签名相同就足够了。进行显式接口(interface)实现可能有点棘手,但您不需要那样做。

关于c# - 使用 Reflection.Emit 实现泛型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21035470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com