c#-调用和区分“它”,“因为”和“建立”的内容
作者:互联网
我最近开始使用MSpec,将类分为“建立”,“因为”和“它”.
尽管我知道如何使用它们,但是我不确定使它们起作用的原因.
我知道他们是代表
Because of = () =>
{
};
但是,当查看委托的定义方式时:
public delegate void Print(int value);
它看起来像“建立,因为和”,它定义为不返回任何值(无效)且不带参数的委托.
这是有道理的,但是“建立”,“因为”和“它”如何彼此区分.即停止使用It而不是建立相同功能的原因.而且其中一个人怎么知道要使用另一个?即它使用建立
而且他们只是被放在班上.是什么调用它们?
public class foobar: setup
{
private static int engineId;
Because of = () =>
{
};
It should = () =>
{
};
}
参见以上内容,已将委托初始化为这些函数.但是我不知道他们是怎么打电话的以及为什么这样不行:
public class foobar: setup
{
private static int engineId;
It of = () =>
{
};
It should = () =>
{
};
}
谁能为我澄清一下?
解决方法:
这些委托具有不同的类型,即使它们都具有相同的签名.因此,根据其类型来区分它们.例如,假设您具有用法示例中的此类:
[Subject("Authentication")]
public class When_authenticating_a_user
{
Establish context = () =>
{
Subject = new SecurityService();
};
Cleanup after = () =>
{
Subject.Dispose();
};
static SecurityService Subject;
}
现在您想模仿运行该测试.您使用反射先获取所有字段,因为上下文和之后都是字段:
var fields = typeof(When_authenticating_a_user).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
现在您有一堆字段,但是哪个是?您可以按字段类型区分它们.一种是“建立”类型,另一种是“清理”类型(两者都是具有相同签名的委托类型):
var establish = fields.FirstOrDefault(c => c.FieldType == typeof(Establish));
var cleanup = fields.FirstOrDefault(c => c.FieldType == typeof(Cleanup));
然后创建一个实例并根据一些逻辑执行它们:
var instance = Activator.CreateInstance(typeof(When_authenticating_a_user));
// get method
var establishMethod = (Establish)establish.GetValue(instance);
// execute
establishMethod();