Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为代理上需要所有接口方法的接口创建C#抽象代理类?_C#_Generics - Fatal编程技术网

如何为代理上需要所有接口方法的接口创建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{…