gpt4 book ai didi

c# - 解决类型是否支持接口(interface)的最佳方法? (鸭子类型(duck typing))

转载 作者:太空宇宙 更新时间:2023-11-03 16:50:11 25 4
gpt4 key购买 nike

我正在使用 Reflection.Emit 在运行时构建一个类型。最终用户提供基本类型,以及新类型应支持的接口(interface)。如果接口(interface)有基类型不能支持的成员,我创建一个 stub 方法调用存储在静态字段上的委托(delegate)(我只支持具有 15 个或更少参数的非泛型方法,没有 ref 或 out 参数,因为这是我当前的要求。请不要提出此限制的问题。委托(delegate)采用 baseType 的第一个参数),用户可以在尝试构造类型之前提供该参数。

但是,我想避免为类型可以满足的接口(interface)成员创建委托(delegate) stub 。例如

public class Goose
{
public void Quack()
{
// quack implementation details go here.
}
}

public interface IDuck
{
void Quack()
}

我希望如果您将带有 new[]{typeof(IDuck)}Goose 发送给我的构建器,我不会为void Quack() as goose 满足接口(interface)。

接口(interface)映射不起作用,因为 Goose 没有实现 IDuck,我不能为接口(interface)映射请求新构建的类型,因为 TypeBuilder 不支持需要的类型待 build 。

我怎样才能以远程有效的方式解决这个问题?我只需要调查公开可见的成员,如果一个类型显式实现了一个具有相同方法的接口(interface),我可以假设它不应该用作目标。 (例如,如果 Goose 实现了 void IGoose.Quack(),那么它不应被视为 void IDuck.Quack() 的目标)。 (无论如何,BindingFlags.Public | BindingFlags.Instance 应该足以过滤掉这些元素)。

最佳答案

您应该通过反射到哈希集中获取所有基本类型的公共(public)实现成员(MemberInfo 确实实现了 GetHashCode 我不知道它是否可以比较不同类型的成员,您可能需要您的哈希对象来匹配签名类型和名称),那么当您循环遍历新接口(interface)的成员时,如果哈希集中不存在 stub 代码,您只会生成 stub 代码。

在成员存在之前在 TypeBuilder 上声明接口(interface)不是问题,只要您在成员存在之前不调用 CreateType 并且您不应该关心基类型实现的其他接口(interface),因为您只关心关于与您的新界面相匹配的成员的签名。

只要您按接口(interface)和基类型缓存结果类型,就性能而言应该不会很差。

关于c# - 解决类型是否支持接口(interface)的最佳方法? (鸭子类型(duck typing)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4258882/

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