Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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语言中的泛型修饰符#_C#_Generics_Aop_Postsharp - Fatal编程技术网

C# C语言中的泛型修饰符#

C# C语言中的泛型修饰符#,c#,generics,aop,postsharp,C#,Generics,Aop,Postsharp,我想知道,既然没有办法在C#(是吗?)中实现这样的泛型装饰器类: public class Decorator<TDecoratorIterface> : TDecoratorInterface { public TDecoratorInterface Component {get; private set;} protected Decorator(TDecoratorInterface component) { Component =

我想知道,既然没有办法在C#(是吗?)中实现这样的泛型装饰器类:

public class Decorator<TDecoratorIterface> : TDecoratorInterface 
{
    public TDecoratorInterface Component {get; private set;}

    protected Decorator(TDecoratorInterface component)
    {
        Component = component;
    }
}
public interface IDogDecorator 
{
    void Bark();
}

public class Dog : IDogDecorator
{
    public void Bark()
    {
        Console.Write("I am a dog");
    }
}

public class StinkingDog : Decorator<IDogDecorator>
{
    public StinkingDog(IDogDecorator dog):base(dog)
    {
    }

    public void Bark()
    {
        Component.Bark();
        Console.WriteLine(" and I stink");
    }
}
公共类装饰器:TDecoratorInterface
{
公共TDecoratorInterface组件{get;private set;}
受保护的装饰器(TDecorator接口组件)
{
组件=组件;
}
}
这样使用:

public class Decorator<TDecoratorIterface> : TDecoratorInterface 
{
    public TDecoratorInterface Component {get; private set;}

    protected Decorator(TDecoratorInterface component)
    {
        Component = component;
    }
}
public interface IDogDecorator 
{
    void Bark();
}

public class Dog : IDogDecorator
{
    public void Bark()
    {
        Console.Write("I am a dog");
    }
}

public class StinkingDog : Decorator<IDogDecorator>
{
    public StinkingDog(IDogDecorator dog):base(dog)
    {
    }

    public void Bark()
    {
        Component.Bark();
        Console.WriteLine(" and I stink");
    }
}
公共接口IDogDecorator
{
空树皮();
}
公家犬:IDogDecorator
{
公共空间
{
安慰。写下(“我是一只狗”);
}
}
公共级臭狗:装饰师
{
公共臭狗(IDogDecorator狗):基地(狗)
{
}
公共空间
{
树皮成分();
控制台。WriteLine(“我很臭”);
}
}
这样的事情可以通过PostSharp或任何其他.NET AOP框架来管理吗


感谢您的回答,我花了半天时间试图创建这样一个构造,但没有成功,因此非常感谢您的帮助:)

这个构造没有直接的等价物,因为C不允许类型的基类是动态的。请记住,泛型类型必须在编译时完全定义,而不是在使用时

有多种可能的方法:在上面的例子中,臭狗应该只实现IDogDecorator接口。因此,只需在此处指定。不管怎样,你都在转接电话

public class StinkingDog : Decorator<IDogDecorator>, IDogDecorator
公共类臭狗:装饰者,IDogDecorator
可能会有一些框架完全按照您的要求来做(例如Rhino.Mocks实际上就是这样创建mock的),但是对于生产代码,我建议不要使用任何AOP方法。它又笨又慢