我用谷歌搜索了“c# compiler github”并最终在https://github.com/dotnet/roslyn
搜索后CallerMemberName
- 我设法找到了这个问题的答案:
https://github.com/dotnet/roslyn/issues/53757
它提到这是通过设计完成的。
但快速浏览票证让我想到 - “我可以将属性用于相同目的吗?”
因为我所做的是单元测试——我已经为此目的重新编码了我自己的属性:TestAttribute
=>FactAttribute
并从 NUnit 方法信息中解析了该属性,并取回了文件路径和方法名称。
public class FactAttribute : TestAttribute
{
public string FunctionName { get; }
public string FilePath { get; }
public FactAttribute( [CallerMemberName] string functionName = "", [CallerFilePath] string filePath = "")
{
FunctionName = functionName;
FilePath = filePath;
}
}
[TestFixture]
public class BaseClass
{
/// <summary>
/// Accesses private class type via reflection.
/// </summary>
/// <param name="_o">input object</param>
/// <param name="propertyPath">List of properties in one string, comma separated.</param>
/// <returns>output object</returns>
object getPrivate(object _o, string propertyPath)
{
object o = _o;
var flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
foreach (var name in propertyPath.Split('.'))
{
System.Type type = o.GetType();
if (char.IsUpper(name[0]))
o = type.GetProperty(name, flags).GetValue(o);
else
o = type.GetField(name, flags).GetValue(o);
}
return o;
}
[SetUp]
public void EachSpecSetup()
{
var mi = (MemberInfo)getPrivate(TestContext.CurrentContext.Test, "_test.Method.MethodInfo");
FactAttribute attr = mi.GetCustomAttribute<FactAttribute>();
string path = attr.FilePath;
string funcName = attr.FunctionName;
}
这允许确定来自哪个文件以及来自哪个方法调用。