gpt4 book ai didi

.NET:是否存在用于将对象属性的值插入字符串的String.Format形式?

转载 作者:行者123 更新时间:2023-12-04 05:11:14 26 4
gpt4 key购买 nike

我认为问题的直接答案是“否”,但我希望有人编写了一个真正简单的库来做到这一点(或者我可以做到...呃...)

让我用一个例子来说明我在寻找什么。
假设我有以下内容:

class Person {
string Name {get; set;}
int NumberOfCats {get; set;}
DateTime TimeTheyWillDie {get; set;}
}

我希望能够做这样的事情:
static void Main() {
var p1 = new Person() {Name="John", NumberOfCats=0, TimeTheyWillDie=DateTime.Today};
var p2 = new Person() {Name="Mary", NumberOfCats=50, TimeTheyWIllDie=DateTime.Max};

var str = String.Format(

"{0:Name} has {0:NumberOfCats} cats and {1:Name} has {1:NumberOfCats} cats. They will die {0:TimeTheyWillDie} and {1:TimeTheyWillDie} respectively
", p1, p2);

Console.WriteLine(str);
}

有谁知道是否存在执行此类操作的格式,或者是否有人编写了库来执行此操作?我知道应该不会太难,但是我宁愿不要重新实现。

最佳答案

编辑:您不必为每个对象实现IFormattable ...那将是PITA,严重限制了工作量,并带来了相当大的维护负担。只需将Reflection和IFormatProvider与ICustomFormatter一起使用,它将与任何对象一起使用。 String.Format具有一个重载以将其作为参数。

我以前从没想过,但是您对我很感兴趣-所以我不得不快速地讲一下。请注意,我选择允许将其他格式的字符串传递给属性值,并且它仅适用于非索引和可访问的属性(尽管您可以轻松地添加它)。

public class ReflectionFormatProvider : IFormatProvider, ICustomFormatter {
public object GetFormat(Type formatType) {
return formatType == typeof(ICustomFormatter) ? this : null;
}

public string Format(string format, object arg, IFormatProvider formatProvider) {
string[] formats = (format ?? string.Empty).Split(new char[] { ':' }, 2);
string propertyName = formats[0].TrimEnd('}');
string suffix = formats[0].Substring(propertyName.Length);
string propertyFormat = formats.Length > 1 ? formats[1] : null;

PropertyInfo pi = arg.GetType().GetProperty(propertyName);
if (pi == null || pi.GetGetMethod() == null) {
// Pass thru
return (arg is IFormattable) ?
((IFormattable)arg).ToString(format, formatProvider)
: arg.ToString();
}

object value = pi.GetGetMethod().Invoke(arg, null);
return (propertyFormat == null) ?
(value ?? string.Empty).ToString() + suffix
: string.Format("{0:" + propertyFormat + "}", value);
}
}

和您稍作修改的示例:
var p1 = new Person() {Name="John", NumberOfCats=0, TimeTheyWillDie=DateTime.Today};
var p2 = new Person() {Name="Mary", NumberOfCats=50, TimeTheyWillDie=DateTime.MaxValue};

var str = string.Format(
new ReflectionFormatProvider(),
@"{0:Name} has {0:NumberOfCats} cats and {1:Name} has {1:NumberOfCats} cats.
They will die {0:TimeTheyWillDie:MM/dd/yyyy} and {1:TimeTheyWillDie} respectively.
This is a currency: {2:c2}.",
p1,
p2,
8.50M
);

Console.WriteLine(str);

输出:
John has 0 cats and Mary has 50 cats. 
They will die 12/10/2008 and 12/31/9999 11:59:59 PM respectively.
This is a currency: $8.50.

关于.NET:是否存在用于将对象属性的值插入字符串的String.Format形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/357447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com