这可能在C#中吗?

wha*_*ave 8 c# reflection

我有一个扩展方法进行测试,所以我可以这样做:

var steve = new Zombie();
steve.Mood.ShouldBe("I'm hungry for brains!");
Run Code Online (Sandbox Code Playgroud)

扩展方法:

public static void ShouldBe<T>(this T actual, T expected)
{
    Assert.That(actual, Is.EqualTo(expected));
}
Run Code Online (Sandbox Code Playgroud)

由此可见:

Expected: "I'm hungry for brains!"
But was:  "I want to shuffle aimlessly"
Run Code Online (Sandbox Code Playgroud)

是否有任何黑客可以从我的扩展方法中获取属性"BrainsConsumed"的名称?奖励积分将是实例变量并输入Zombie.

更新:

新的ShouldBe:

public static void ShouldBe<T>(this T actual, T expected)
{
    var frame = new StackTrace(true).GetFrame(1);
    var fileName = frame.GetFileName();
    var lineNumber = frame.GetFileLineNumber() - 1;
    var code = File.ReadAllLines(fileName)
        .ElementAt(lineNumber)
        .Trim().TrimEnd(';');

    var codeMessage = new Regex(@"(^.*)(\.\s*ShouldBe\s*\()([^\)]+)\)").Replace(code, @"$1 should be $3");

    var actualMessage = actual.ToString();
    if (actual is string)
        actualMessage = "\"" + actual + "\"";

    var message = string.Format(@"{0} but was {1}", codeMessage, actualMessage);

    Assert.That(actual, Is.EqualTo(expected), message);
}
Run Code Online (Sandbox Code Playgroud)

这打印出来:

steve.Mood should be "I'm hungry for brains!" but was "I want to shuffle aimlessly"
Run Code Online (Sandbox Code Playgroud)

谢谢大家,特别是 Matt Dotson,这太棒了.顺便说一句,不要给丝滑的巨魔喂人.

Mat*_*son 3

如果是调试版本,您可以通过使用某些诊断类来获取代码。鉴于这是用于单元测试,DEBUG 可能是合理的。

public static void ShouldBe<T>(this T actual, T expected)
Run Code Online (Sandbox Code Playgroud)

{

var frame = new StackTrace(true).GetFrame(1);
var fileName = frame.GetFileName();
var lineNumber = frame.GetFileLineNumber() - 1;

string code = File.ReadLines(fileName).ElementAt(lineNumber).Trim();

Debug.Assert(actual.Equals(expected), code);
Run Code Online (Sandbox Code Playgroud)

}

对于您的示例,代码 =“steve.BrainsConsumed.ShouldBe(0);”

显然,您应该向此代码添加一些错误检查,并且您可以通过不读取文件中的所有行来使其更快。