C# “是什么引起和区别了?”;它是&引用;因为";及;设立;
我最近开始使用MSpec,将类分为,C# “是什么引起和区别了?”;它是&引用;因为";及;设立;,c#,mspec,C#,Mspec,我最近开始使用MSpec,将类分为,建立,因为和,它 虽然我知道如何使用它们,但我不确定是什么让它们起作用 我知道他们是代表 Because of = () => { }; 但在了解如何定义代理时: public delegate void Print(int value); 它看起来像是build,,因为和It被定义为不返回任何内容(void)且不接受任何参数的委托 这是有道理的,但是如何建立,,因为和,是相互区别的。也就是说,停止使用It而不是建立的内容仍能正常工作。他们中的一个
建立
,因为
和,它
虽然我知道如何使用它们,但我不确定是什么让它们起作用
我知道他们是代表
Because of = () =>
{
};
但在了解如何定义代理时:
public delegate void Print(int value);
它看起来像是build
,,因为和It
被定义为不返回任何内容(void
)且不接受任何参数的委托
这是有道理的,但是如何建立
,,因为
和,是相互区别的。也就是说,停止使用It
而不是建立
的内容仍能正常工作。他们中的一个怎么知道如何使用另一个?i、 e.它使用建立
而且他们只是被安排在课堂上。是什么激发了他们
public class foobar: setup
{
private static int engineId;
Because of = () =>
{
};
It should = () =>
{
};
}
请参见上文,将委托初始化为这些函数。但我不知道他们是怎么被叫的,为什么这不好:
public class foobar: setup
{
private static int engineId;
It of = () =>
{
};
It should = () =>
{
};
}
谁能帮我澄清一下吗?是的,他们是代表:
它们都是无参数的void委托,它们在框架中的使用方式上彼此不同。例如,接受It
的方法不会接受建立
,因此表明了该方法的意图。不同的代理实际上是不同的类型,即使它们具有相同的签名。(您可以创建一个委托来包装具有兼容签名的不同委托类型的实例,但这种情况相对较少。)
我并不是说我特别喜欢框架或所选的名称,但是如果让不同的代理恰好具有相同的签名,那么对于这些代理来说,表达不同的预期含义是非常有意义的。这些代理具有不同的类型,尽管它们都具有相同的签名。所以它们是根据它们的类型来区分的。例如,假设您有来自示例用法的此类:
[Subject("Authentication")]
public class When_authenticating_a_user
{
Establish context = () =>
{
Subject = new SecurityService();
};
Cleanup after = () =>
{
Subject.Dispose();
};
static SecurityService Subject;
}
现在你想模拟运行那个测试。使用反射首先获取所有字段,因为context
和after
都是字段:
var fields = typeof(When_authenticating_a_user).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
现在你有一堆字段,但哪个是哪个?您可以根据字段类型来区分它们。一种类型为建立
,另一种类型为清除
(两者都是具有相同签名的代理类型):
然后创建一个实例,并根据某些逻辑执行它们:
var instance = Activator.CreateInstance(typeof(When_authenticating_a_user));
// get method
var establishMethod = (Establish)establish.GetValue(instance);
// execute
establishMethod();
你看过定义了吗?什么,特别是那些定义你不清楚吗?哦,是的,对不起,他们是代表。但这仍然留下了一个问题,即它们如何区分和相互使用。我会更新我的问题。
var instance = Activator.CreateInstance(typeof(When_authenticating_a_user));
// get method
var establishMethod = (Establish)establish.GetValue(instance);
// execute
establishMethod();