1

我需要出于某种目的解析我的类,以便为每个属性提供特定的文本字符串。

 namespace MyNameSpace
    {
        [MyAttribute]
        public class MyClass
        {

            [MyPropertyAttribute(DefaultValue = "Default Value 1")]
            public static string MyProperty1
            {
                get { return "hello1"; }
            }

            [MyPropertyAttribute(DefaultValue = "Default Value 2")]
            public static string MyProperty2
            {
                get { return "hello2"; }
            }

        }
    }

这是我的 linq 查询,用于解析此类所在的文件

var lines =
    from line in File.ReadAllLines(@"c:\someFile.txt")
        where line.Contains("public static string ")
    select line.Split(' ').Last();


    foreach (var line in lines)
    {
         Console.WriteLine(string.Format("\"{0}\", ", line));
    }

我正在尝试输出以下内容,但我不知道如何为此编写 linq 查询。

{"MyProperty1", "Default Value 1"}
{"MyProperty2", "Default Value 2"}
4

2 回答 2

1

这个怎么样?

foreach (var propertyInfo in typeof (MyClass).GetProperties()) {
    var myPropertyAttribute =
        propertyInfo.GetCustomAttributes(false).Where(attr => attr is MyPropertyAttribute).SingleOrDefault<MyPropertyAttribute>();
    if (myPropertyAttribute != null) {
        Console.WriteLine("{{\"{0}\",\"{1}\"}}", propertyInfo.Name, myPropertyAttribute.DefaultValue);
    }
}
于 2013-01-12T02:16:08.593 回答
0

正则表达式可能是一个更简单的解决方案:

var str = File.ReadAllLines(@"c:\someFile.txt");
var regex =
    @"\[MyPropertyAttribute\(DefaultValue = ""([^""]+)""\)\]" +
    @"\s+public static string ([a-zA-Z0-9]+)";

var matches = Regex.Matches(str, regex);

foreach (var match in matches.Cast<Match>()) {
    Console.WriteLine(string.Format("{{\"{0}\", \"{1}\"}}", 
        match.Groups[2].Value, match.Groups[1].Value));
}

样本输出:

{"MyProperty1", "Default Value 1"}
{"MyProperty2", "Default Value 2"}

演示:http: //ideone.com/D1AUBK

于 2013-01-12T02:13:39.847 回答