如果您想要生成字符串,您可以使用Linq来枚举属性:
MyClass test = new MyClass {
FirstName = "John",
LastName = "Smith",
};
String result = "My Name is " + String.Join(" ", test
.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(property => property.CanRead)
.Select(property => property.GetValue(test)));
Console.Write(result);
如果你想在字符串中进行替换(类似格式化),则正则表达式可以成为解析字符串的良好选择:
String original = "My Name is @MyClass.FirstName @MyClass.LastName";
String pattern = "@[A-Za-z0-9\\.]+";
String result = Regex.Replace(original, pattern, (MatchEvaluator) ((match) =>
test
.GetType()
.GetProperty(match.Value.Substring(match.Value.LastIndexOf('.') + 1))
.GetValue(test)
.ToString() // providing that null can't be returned
));
// My Name is John Smith
Console.Write(result);
请注意,为了获取实例(即非静态)属性的值,您必须提供实例(上面代码中的
test
):
.GetValue(test)
所以字符串中的 @MyClass 部分是无用的,因为我们可以直接从实例中获取类型:
test.GetType()
编辑:如果某些属性的返回值可能为null
String result = Regex.Replace(original, pattern, (MatchEvaluator) ((match) => {
Object v = test
.GetType()
.GetProperty(match.Value.Substring(match.Value.LastIndexOf('.') + 1))
.GetValue(test);
return v == null ? "NULL" : v.ToString();
}));
string.Format("My Name is {0} {1}", obj.FirstName, obj.LastName)
这段代码?或者,如果你用的是 C# 6,更好的写法是$"My Name is {obj.FirstName} {obj.LastName}"
。 - Kvam@MyClass
是无用的:为了获取实例(即非static
)的属性值,您必须提供该实例:MyClass my = ... .GetValue(my);
有了这个实例,您可以通过简单的my.GetType()
获取类型(MyClass)。 - Dmitry Bychenko