c# - 是否有可能获得例如代码中的位置成员(member)信息?

标签 c# reflection custom-attributes

问题

有没有办法获取代码中使用属性的位置,或声明成员变量的位置?

我不是在寻找解决此问题的方法,只是寻求一个简单的答案,无论这在技术上是否可行。

一些背景信息

我已经定义了一个属性,该属性使用提供给属性的参数将成员连接到 Unity UI 文档中的 VisualElement。这是一个例子:

[Query("button-upvote")]
private Button _buttonUpvote;

现在在某些情况下该元素不存在,这意味着 _buttonUpvote 无法解析,可能是因为有错字,在这种情况下我想向 Unity 控制台记录警告。在这个警告中,我得到了一个堆栈跟踪,但我没有得到一个堆栈跟踪,它引导我到上面示例中的属性或有问题的成员,它引导我到记录警告的代码,这是完全不相关的在这种情况下的实际错误。我想在警告日志中包含使用 Query 属性的位置。

最佳答案

不确定在 Unity 中是否可行,但在最新的 .NET 编译器中您可以使用 CallerFilePathAttributeCallerLineNumberAttribute :

public class MyAttribute : Attribute
{
    public string Path { get; }
    public int Line { get; }

    public MyAttribute(string someVal, [CallerFilePath] string path = "",[CallerLineNumber] int line = 0)
    {
        Path = path;
        Line = line;
    }
}

class MyClass
{
    [My("test")]
    public int Test { get; set; }
}

var myAttribute = typeof(MyClass).GetProperty(nameof(MyClass.Test)).GetAttribute<MyAttribute>();
Console.WriteLine($"{myAttribute?.SomeVal} - {myAttribute?.Path} - {myAttribute?.Line}"); // prints something like: test - D:\Projects\TestApp\SoAnswers.NET6\CallerLineAttibuteTests.cs - 19

关于c# - 是否有可能获得例如代码中的位置成员(member)信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72544566/

相关文章:

C# 属性用法 : only allow attributes on a property with specific data type

c# - 使用 Matrox 命令捕获帧

c# - Ninject woes... 404错误问题

c# - C# 通用属性限制的解决方法

c# - 从类型的部分名称获取 System.Type

c# - 标识方法的开始和结束

c# 如何正确渲染图像?

c# - 检查所有链接 Selenium C#

Python:有没有办法反射性地列出一个类的所有属性

c# - 避免字典自定义属性的标记接口(interface)?