要求实现一个string template engine.
publicstring Apply(string template, object dataSource) {
}
根据输入的template和dataSource得到输出值
eg:
Template | DataSource | Output |
Hello [Name] | { Name = "John" } | Hello John |
Hello [Contact.FirstName] [Contact.LastName] |
{ Contact = new { FirstName = "John", LastName = "Smith" } } |
Hello John Smith |
[With Contact] Hello [FirstName] [LastName] [With Organisation] You are from [Name] in [City] [/With] [/With] |
{ Contact = new { FirstName = "John", LastName = "Smith" Organisation = new { Name = "Acme Ltd" City = "Auckland" } } } |
Hello John Smith You are from Acme Ltd in Auckland |
请教有会的大侠吗 万分感谢
public static string Apply(string template, object dataSource) { template = Regex.Replace(template, @"(?<=\[With\s+(\w+)\].*?)\[With\s+(\w+)\]", "[With $1.$2]"); template = Regex.Replace(template, @"(?<=\[With\s+((\w+\.)*\w+)\].*?)\[(\w+)\]", "[$1.$3]"); template = Regex.Replace(template, @"\[With\s+((\w+\.)*\w+)\]|\[/With\]", ""); var matchs = Regex.Matches(template, @"\[(\w+\.)*\w+\]"); JavaScriptSerializer serializer = new JavaScriptSerializer(); dynamic data = serializer.Deserialize(serializer.Serialize(dataSource), typeof(object)); foreach (Match m in matchs) { var keys=m.Value.Substring(1,m.Value.Length-2).Split('.'); dynamic myvalue = data[keys[0]]; for (int i = 1; i < keys.Length; i++) { myvalue = myvalue[keys[i]]; } template = template.Replace(m.Value, myvalue.ToString()); } return template; }
这个面试题,不单是这三种结构,这个Apply方法要使用任何类型的数据源和任何类型的结构。而且是要在这一个方法中实现。
有方法吗
@新西兰程序员: 只要template 结构不变就行了,datasource已经是 object 类型了
@新西兰程序员: 模板都有一定规则的,要通用任何结构,这么万能还真没有
这个面试题不是面试初级程序员的吧,你面错职位了。
中午一觉睡醒就看到这个面试题, 虽然我不是什么大侠, 但是考虑到楼主在面试比较着急,我就憋着尿,给出我的code思路, 希望能帮到楼主, 如果面试完了有时间的话, 希望楼主能采纳!
1 public string Apply(string template, object dataSource) 2 { 3 string output = string.Empty; 4 var dataSourceAllFields = dataSource.GetType().GetProperties(); 5 foreach (var sourceField in dataSourceAllFields) 6 { 7 template = template.Replace(string.Format("[{0}]", sourceField.Name), sourceField.Attributes.ToString()); 8 } 9 10 output = template; 11 return output; 12 }
无法解决第三个用例。。
@幻天芒: 这只是个思路, 第三个示例里面意思是说可能有很多类的嵌套, 这个需要用递归了。 刚睡醒,就没写那么深了。
@请叫我头头哥: 嗯,模板替换的思路还是不错的。。我想了想使用codeDom,还是比较复杂。
@幻天芒:
With 这个结构就得硬来了...
@爱编程的大叔: 如果是js,还比较容易实现一点。