我在运行时使用Reflection.Emit
. 最终用户提供基本类型以及新类型应支持的接口。如果接口具有基类型不支持的成员,我创建一个存根方法,该方法调用存储在静态字段上的委托(我只支持具有 15 个或更少参数的非泛型方法,没有 ref 或 out 参数,因为这是我当前的要求。请不要提出此限制的问题。委托采用 baseType 的第一个参数),用户可以在尝试构造类型之前提供该参数。
但是,我想避免为类型可以满足的接口成员创建委托存根。例如
public class Goose
{
public void Quack()
{
// quack implementation details go here.
}
}
public interface IDuck
{
void Quack()
}
我希望如果您将这里发送Goose
给new[]{typeof(IDuck)}
我的构建器,我不会void Quack()
为 goose 满足接口创建存根。
接口映射不起作用,因为 Goose 没有实现 IDuck,并且我不能要求新构建的类型进行接口映射,因为TypeBuilder
它不支持需要构建的类型。
如何以远程有效的方式解决此问题?我只需要调查公开可见的成员,如果一个类型显式地实现了一个具有相同方法的接口,我可以假设它不应该用作目标。(例如,如果 Goose 已实现void IGoose.Quack()
,则不应将其视为 的目标void IDuck.Quack()
)。(无论如何, BindingFlags.Public | BindingFlags.Instance
应该足以过滤掉这些元素)。