我有一个关于 Castle Dynamic Proxy 的问题(我使用 Castle Windsor 作为 IoC 框架已经有一段时间了,但从未直接使用过动态代理)。
我有几个描述类能力的接口。例如:
public interface IBeatScissors
{
void BeatScissors();
}
public interface IBeatRock
{
void BeatRock();
}
public interface IBeatPaper
{
void BeatPaper();
}
public interface IBeatSpock
{
void BeatSpock();
}
public interface IBeatLizard
{
void BeatLizard();
}
以下是实现它们的类:
public abstract class Rock : Weapon, IBeatScissors, IBeatLizard
{
public abstract void BeatScissors();
public abstract void BeatLizard();
}
public abstract class Paper : Weapon, IBeatRock, IBeatSpock
{
public abstract void BeatRock();
public abstract void BeatSpock();
}
public abstract class Scissors : Weapon, IBeatPaper, IBeatLizard
{
public abstract void BeatPaper();
public abstract void BeatLizard();
}
public abstract class Lizard : Weapon, IBeatPaper, IBeatSpock
{
public abstract void BeatPaper();
public abstract void BeatSpock();
}
public abstract class Spock : Weapon, IBeatScissors, IBeatRock
{
public abstract void BeatScissors();
public abstract void BeatRock();
}
此外,我还有更多结合上述功能的接口(这些是我所说的“元接口”):
public interface IBeatScissorsAndLizard : IBeatScissors, IBeatLizard
{
}
public interface IBeatRockAndSpock : IBeatRock, IBeatSpock
{
}
public interface IBeatPaperAndLizard : IBeatPaper, IBeatLizard
{
}
public interface IBeatPaperAndSpock : IBeatPaper, IBeatSpock
{
}
public interface IBeatScissorsAndRock : IBeatScissors, IBeatRock
{
}
现在我想将实现类“转换”(或其他)这些元接口并将它们传递给使用方法:
public abstract class Game
{
public void BeatScissorsAndLizard(Weapon weapon)
{
var w = weapon.Duck<IBeatScissorsAndLizard>();
if(w == null)
throw new Exception("You can't win!");
w.BeatScissors();
w.BeatLizard();
}
public abstract void BeatRockAndSpock(Weapon weapon);
public abstract void BeatPaperAndLizard(Weapon weapon);
public abstract void BeatPaperAndSpock(Weapon weapon);
public abstract void BeatScissorsAndRock(Weapon weapon);
}
在我的实际应用程序中,我不能简单地让实现类也实现元接口,因为可能的组合数量太大了——这只是一个例子!
我过去一直在使用Cs-Script,它有一个名为“AlignToInterface”的扩展方法,它几乎可以实现我想要实现的目标,例如:
Rock rock = new Rock();
IBeatScissorsAndLizard beatem = rock.AlignToInterface<IBeatScissorsAndLizard>();
不幸的是,我不能在这里使用它,因为它抱怨元接口没有实现派生方法。我认为这是一个错误 - 一个接口怎么可能实现另一个接口?!?!
现在,我的问题是是否(如果是,如何)使用 Castle Dynamic 代理来完成类似的操作?
任何帮助表示赞赏!
更新:编辑了消费示例。