【问题标题】:Get Properties with specific Attributes (Just-in-Time compiling)获取具有特定属性的属性(即时编译)
【发布时间】:2019-11-06 00:25:23
【问题描述】:

我的任务是从 .cs 文件中找到具有某些属性的属性。所以我得到了 .cs 文件,我必须在它们中搜索某些属性并将它们保存在 XML 中。

因此,每个具有属性 [ID] 的属性我都应该将值与 ID 一起存储。 在上下文中我应该如何实现这一点,使用了“即时编译器”和“反射”这个词。但我不知道如何开始,因为我以前从未使用过即时编译器/反射。

首先我用正则表达式尝试了它,但我无法获得属性。将 .cs 文件作为字符串加载时如何获取属性值? (或者我应该怎么做?) 我搜索的 .cs 文件:

[ID(12345678)]
public string quack {get; set}

我尝试过的脚本:

string document = File.ReadAllText(@"FilePath.cs");
    var searchPatternID = @"(?<![\p{Zs}\t]*//.*)(?<!/\*(?:(?!\*/)[\s\S\r])*?)\[[\n\r\s]*ID(.*?\n*?)*?\]";

    var matches = Regex.Matches(document, searchPatternID );

     foreach (var m in matches)
     {
         Console.WriteLine(m);
     }

这里我只搜索ID。如何获得“quack”的值?

我的期望:

[ID(12345678)]
public string quack {get; set}

public string wuff {get; set}

在这里,我希望 quack 的值与 ID 一起出现。

【问题讨论】:

  • 您确定要搜索 *.cs 文件吗?这些在分发后不可用。您可能想使用反射来搜索属性/属性,请参阅此处如何检查属性的属性:stackoverflow.com/a/2051116/4035472

标签: c# reflection properties attributes


【解决方案1】:

您可以使用此代码

var properties = typeof(MyClass).GetProperties();
        var specificProperty = properties.Where(t => t.CustomAttributes.Any(y => y.AttributeType.FullName == "MyTestAttribute")).ToList()
            .Select(z=>z.CustomAttributes).ToList();
        var values = specificProperty.Select(s => s.First().ConstructorArguments.First().Value).ToList();

【讨论】:

    【解决方案2】:

    如果您想获取 ID 属性,您必须通过 typeof().GetType() 获取 CustomAtributes。

    var attributes = typeof(YourClass).CustomAttributes;
    

    然后您可以查找您的属性及其值或任何您想要的。

    所以你可以得到所有的属性,然后寻找属性:

        var properties = typeof(YourClass).Properties();
        foreach (var prop in properties)
        {
            prop.CustomAttributes.CheckAttribute();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-13
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2020-05-08
      • 2017-09-02
      相关资源
      最近更新 更多