我需要解析我的类,以便为每个属性提供特定的文本字符串。
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"}
答案 0 :(得分: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);
}
}
答案 1 :(得分: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"}