C# 按返回类型区分运行时的方法

C# 按返回类型区分运行时的方法,c#,type-conversion,C#,Type Conversion,我们正在开发类似于规范框架的东西(例如MSpec、NSpec等),并希望在运行时区分规范类中的方法: public class AccountSpecs { private Account sut; // subject under test Given an_account() { sut = new Account(); } When changing_owner() { var result = sut.ChangeOwner("new

我们正在开发类似于规范框架的东西(例如MSpec、NSpec等),并希望在运行时区分规范类中的方法:

public class AccountSpecs
{
    private Account sut; // subject under test

    Given an_account() { sut = new Account(); }

    When changing_owner()
    {
        var result = sut.ChangeOwner("new owner");
        It["returns_previous_owner"] = () => result.ShouldBe("old owner");
    }
}
正如您所看到的,这个类是不可编译的,因为_account()和changing_owner()没有返回语句

问题1:我想在C#中绝对没有办法指定如果没有给出return语句,默认情况下使用“returnnull”

由于没有全局类型别名(类似于
typedef When As System.Void
),我们被迫实际引入给定的类,以及何时和何时强制用户在此方法中返回某些内容

我们在When方法中为
When.ENABLED
When.DISABLED(“原因”)
使用return语句临时禁用规范

在“给定方法”中,我们希望返回被测试的主题。我们希望实现以下功能:

Given an_account() { sut = new Account(); return sut; }
但是:“无法将表达式类型…转换为返回类型…”

接下来,我们考虑对给定的任何对象使用隐式转换运算符,但这在C#中也不允许,请参见:


问题2:那么,有没有什么解决办法可以让它发挥作用,或者返回类型区别的想法注定了吗?

如果你稍微改变一下设计,就会有很多选择

  • 您可以向给定类型添加一个属性,该属性将保存对任何对象的引用,这样一个帐户将
    返回给定(sut)
  • 您可以从\u帐户返回普通对象,并使用
    [Given]
    属性标记该方法
  • 您还可以在类方法中去掉此方法,只使用具有流畅接口的构建器模式(如linq)来创建测试定义
  • 像这样:

    new Test()
        .Given(() =>new Account())
        .When(()=> ...);
    

    如果你稍微改变一下你的设计,有很多选择

  • 您可以向给定类型添加一个属性,该属性将保存对任何对象的引用,这样一个帐户将
    返回给定(sut)
  • 您可以从\u帐户返回普通对象,并使用
    [Given]
    属性标记该方法
  • 您还可以在类方法中去掉此方法,只使用具有流畅接口的构建器模式(如linq)来创建测试定义
  • 像这样:

    new Test()
        .Given(() =>new Account())
        .When(()=> ...);
    

    听起来你需要设计自己的语言。也有其他人这样做,例如SpecFlow,但是,我们认为创建自己的DSL会大大降低用户对框架的接受度。请帮自己一个忙,选择更好的类名(当/给定/应该时),否则,当/given在给定的上下文中是完全正常的类名时,您将被跟踪。ShouldBe是非常著名的FluentAssertions项目的一个扩展方法。不,默认值不会阻止我们的用户编写样板返回语句。听起来您需要设计自己的语言。但是,还有其他人这样做,例如SpecFlow,我们认为创建我们自己的DSL会极大地降低用户对框架的接受度。请帮自己一个忙,选择更好的类名(when/given/shouldbe),否则您将追求when/given在给定上下文中完全正常的类名。ShouldBe是非常著名的FluentAssertions项目的一个扩展方法。不,默认值不会阻止我们的用户编写样板返回语句。谢谢。这不是一个真正的答案,因为我的问题似乎没有这样的东西,但我想这是下一个最好的东西。谢谢。这不是一个真正的答案,因为我的问题似乎没有这样的东西,但我想这是下一个最好的事情。