【发布时间】:2014-10-15 21:17:06
【问题描述】:
我正在阅读interesting article using of DataFlow + dynamic method invocation to make an Actor model in C#。这是完整的示例。
using System;
using System.Threading.Tasks.Dataflow;
namespace ConsoleApplication
{
public abstract class Message { }
public abstract class Actor
{
private readonly ActionBlock<Message> _action;
public Actor()
{
_action = new ActionBlock<Message>(message =>
{
dynamic self = this;
dynamic mess = message;
self.Handle(mess);
});
}
public void Send(Message message)
{
_action.Post(message);
}
}
class Program
{
public class Deposit : Message
{
public decimal Amount { get; set; }
}
public class QueryBalance : Message
{
public Actor Receiver { get; set; }
}
public class Balance : Message
{
public decimal Amount { get; set; }
}
public class AccountActor : Actor
{
private decimal _balance;
public void Handle(Deposit message)
{
_balance += message.Amount;
}
public void Handle(QueryBalance message)
{
message.Receiver.Send(new Balance { Amount = _balance });
}
}
public class OutputActor : Actor
{
public void Handle(Balance message)
{
Console.WriteLine("Balance is {0}", message.Amount);
}
}
static void Main(string[] args)
{
var account = new AccountActor();
var output = new OutputActor();
account.Send(new Deposit { Amount = 50 });
account.Send(new QueryBalance { Receiver = output });
Console.WriteLine("Done!");
Console.ReadLine();
}
}
}
这按预期工作。将 Actor 和 Message 类移动到新的类库中并正确引用会导致问题。运行时,它会在 Actor 构造函数中的动态 self.Handle(mess); 上抛出 RuntimeBinderException,即 Actors.Actor does not contain a definition for 'Handle'。是否存在我在 MSDN 中似乎找不到的动态方法调用的限制,或者我缺少从单独的类库中执行此操作的语法魔术?
【问题讨论】:
标签: c# dynamic actor dataflow tpl-dataflow