如何为代理上需要所有接口方法的接口创建C#抽象代理类?
我正在尝试为几个接口创建一个抽象代理。显然,具体的代理实现和它“面对”的具体代理类都必须实现相同的接口。代理接受代理类(代理到)。理想情况下,我不会约束接口,但我会。因此,我下面的示例使用如何为代理上需要所有接口方法的接口创建C#抽象代理类?,c#,generics,C#,Generics,我正在尝试为几个接口创建一个抽象代理。显然,具体的代理实现和它“面对”的具体代理类都必须实现相同的接口。代理接受代理类(代理到)。理想情况下,我不会约束接口,但我会。因此,我下面的示例使用IProxiableInterface强制执行 以下是一些示例代码,除了此问题外,所有代码看起来都很好: 如果没有父类,Rider会抱怨“T”:需要类型名 对于父类,Rider说“T”:应该是接口名 对于这两种情况,编译器都会说“错误CS0689:无法从'T'派生,因为它是一个类型参数” 它们都允许具体代理无
IProxiableInterface
强制执行
以下是一些示例代码,除了此问题外,所有代码看起来都很好:
- 如果没有父类,Rider会抱怨“T”:需要类型名
- 对于父类,Rider说“T”:应该是接口名
- 对于这两种情况,编译器都会说“错误CS0689:无法从'T'派生,因为它是一个类型参数”
- 它们都允许具体代理无法实现接口
抽象类AbstractProxy:/*单行为,*/T//“Hi”;
}
密封类HiProxy:AbstractProxy{
公共HiProxy(IFriendly impl):基(impl){
公共字符串sayHi()=>impl.sayHi()这是一种需要元编程的场景;具体地说,您需要实现一个只在运行时才知道的特定接口,这不是针对预编译类型可以表达的。通常,您会在运行时使用TypeBuilder
创建一个新类型,实现所需的类型,然后使用反射检查所需的接口,查找所需的成员,将这些成员添加到新类型(MethodBuilder
等),并编写一个调用所需代理逻辑的实现(ILGenerator
)(这可能涉及通过ILGenerator
编写一个构造函数,该构造函数将代理实例作为参数存储在字段中,然后在代理步骤的每个方法中访问该字段)。然后创建具体类型,并将其作为缓存存储在某处(因为所有这些TypeBuilder
工作都很昂贵)。这是一个很大的工作!作为一个起点:这是一种需要元编程的场景;具体来说,您需要实现一个只在运行时知道的特定接口,这不是针对预编译类型可以表达的东西。通常,您最终会使用TypeBuilder
在runti创建一个新类型me,实现所需的类型,然后使用反射检查所需的接口,查找所需的成员,将这些成员添加到新类型(MethodBuilder
等),并编写调用所需代理逻辑的实现(ILGenerator
)(这可能涉及通过ILGenerator
编写一个构造函数,该构造函数将代理实例作为参数存储在字段中,然后在代理步骤的每个方法中访问该字段)。然后创建具体类型,并将其作为缓存存储在某处(因为所有这些TypeBuilder
工作都很昂贵)。这是一个很大的工作!作为一个起点:看起来您希望您的AbstractProxy
使用组合而不是继承,因此您不需要从任何东西派生它:
abstract class AbstractProxy<T> where T : IProxiableInterface
{
protected T impl;
public AbstractProxy(T impl)
{
this.impl = impl;
}
}
看起来您希望您的AbstractProxy
使用组合而不是继承,因此您不需要从任何东西派生它:
abstract class AbstractProxy<T> where T : IProxiableInterface
{
protected T impl;
public AbstractProxy(T impl)
{
this.impl = impl;
}
}
唯一可行的方法是:抽象类抽象代理:IProxiableInterface其中T:IProxiableInterface{…
唯一可行的方法是:抽象类抽象代理:IProxiableInterface其中T:IProxiableInterface{…