编程语言
首页 > 编程语言> > c#-调用和区分“它”,“因为”和“建立”的内容

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();

标签:mspec,c
来源: https://codeday.me/bug/20191025/1926532.html