C# 在运行时设置String.Format
我有一个XML文件,我想让最终用户设置字符串的格式 例:C# 在运行时设置String.Format,c#,C#,我有一个XML文件,我想让最终用户设置字符串的格式 例: {0} - {1} 名称(正在格式化的对象的属性) 电话 所以在运行时,我会以某种方式将其转换为String.Format(“{0}-{1}”,usr.Name,usr.Phone) 这可能吗?当然可以。格式字符串就是那个,字符串 string fmt = "{0} - {1}"; // get this from your XML somehow string name = "Chris"; string phone =
{0} - {1}
名称(正在格式化的对象的属性)
电话
所以在运行时,我会以某种方式将其转换为String.Format(“{0}-{1}”,usr.Name,usr.Phone)代码>
这可能吗?当然可以。格式字符串就是那个,字符串
string fmt = "{0} - {1}"; // get this from your XML somehow
string name = "Chris";
string phone = "1234567";
string name_with_phone = String.Format(fmt, name, phone);
小心点,因为最终用户可能会破坏程序。不要忘记。XElement root=XElement.Parse(
@"
{0} - {1}
达米思
071444444
");
var format=root.subjects(“format”).FirstOrDefault()值;
var result=string.Format(格式,root.substands(“Parm”)
.Select(x=>x.Value).ToArray();
如何使用参数名称指定格式字符串:
<Viewdata>
<Format>{Name} - {Phone}</Format>
</Viewdata>
{Name}-{Phone}
然后像这样:
你可以做这项工作。简短的回答是肯定的,但这取决于格式选项的多样性,这将有多困难
如果您有一些格式字符串接受5个参数,而另一些只接受3个参数,则需要考虑这一点
我会解析参数的XML并将其存储到对象数组中以传递给String.Format函数。我同意其他海报上的说法,他们说你可能不应该这样做,但这并不意味着我们不能从这个有趣的问题中获得乐趣。因此,首先,这个解决方案是半生不熟/粗糙的,但如果有人想构建它,这是一个良好的开端
我在我喜欢的LinqPad中编写了它,因此Dump()
void Main()
{
XElement root = XElement.Parse(
@"<Viewdata>
<Format>{0} | {1}</Format>
<Parm>Name</Parm>
<Parm>Phone</Parm>
</Viewdata>");
var formatter = root.Descendants("Format").FirstOrDefault().Value;
var parms = root.Descendants("Parm").Select(x => x.Value).ToArray();
Person person = new Person { Name = "Jack", Phone = "(123)456-7890" };
string formatted = MagicFormatter<Person>(person, formatter, parms);
formatted.Dump();
/// OUTPUT ///
/// Jack | (123)456-7890
}
public string MagicFormatter<T>(T theobj, string formatter, params string[] propertyNames)
{
for (var index = 0; index < propertyNames.Length; index++)
{
PropertyInfo property = typeof(T).GetProperty(propertyNames[index]);
propertyNames[index] = (string)property.GetValue(theobj);
}
return string.Format(formatter, propertyNames);
}
public class Person
{
public string Name { get; set; }
public string Phone { get; set; }
}
void Main()
{
XElement root=XElement.Parse(
@"
{0} | {1}
名称
电话
");
var formatter=root.substands(“Format”).FirstOrDefault().Value;
var parms=root.substands(“Parm”).Select(x=>x.Value.ToArray();
Person-Person=新人{Name=“Jack”,Phone=“(123)456-7890”};
字符串格式化=MagicFormatter(person、formatter、parms);
格式化的.Dump();
///输出///
///杰克|(123)456-7890
}
公共字符串MagicFormatter(T theobj、字符串格式化程序、参数string[]propertyNames)
{
对于(var index=0;index
您可以使用并使整个格式命令可编辑:
class Person
{
public string Name;
public string Phone;
public Person(string n, string p)
{
Name = n;
Phone = p;
}
}
static void TestDynamicLinq()
{
foreach (var x in new Person[] { new Person("Joe", "123") }.AsQueryable().Select("string.Format(\"{0} - {1}\", it.Name, it.Phone)"))
Console.WriteLine(x);
}
我想这可能与反射有关,但这听起来像一个XY问题名称,电话似乎是一个对象的属性,所以不要认为这会起作用(这也是我的第一个想法)@Sayse:不过,你可以在“用户”类中完成。或者只需调用String.Format(fmt,usr.Name,usr.Phone)
。是的,但我认为需要一些更通用的(字段未知的地方)正确。它将始终是(User)类型,但我希望最终用户设置格式,以及在String.format()期间使用obj的哪些属性@克里斯。我现在明白了。不过,我不会以这种方式实现,因为您将向最终用户公开您的类。我会制作一些格式字符串,比如{name}-{phone}
,并记录您将接受的属性。然后使用字符串替换来创建格式字符串。这还可以防止用户执行类似{0:-100000000000000000000000}
之类的操作。他希望对像user这样的对象调用params数组
void Main()
{
XElement root = XElement.Parse(
@"<Viewdata>
<Format>{0} | {1}</Format>
<Parm>Name</Parm>
<Parm>Phone</Parm>
</Viewdata>");
var formatter = root.Descendants("Format").FirstOrDefault().Value;
var parms = root.Descendants("Parm").Select(x => x.Value).ToArray();
Person person = new Person { Name = "Jack", Phone = "(123)456-7890" };
string formatted = MagicFormatter<Person>(person, formatter, parms);
formatted.Dump();
/// OUTPUT ///
/// Jack | (123)456-7890
}
public string MagicFormatter<T>(T theobj, string formatter, params string[] propertyNames)
{
for (var index = 0; index < propertyNames.Length; index++)
{
PropertyInfo property = typeof(T).GetProperty(propertyNames[index]);
propertyNames[index] = (string)property.GetValue(theobj);
}
return string.Format(formatter, propertyNames);
}
public class Person
{
public string Name { get; set; }
public string Phone { get; set; }
}
class Person
{
public string Name;
public string Phone;
public Person(string n, string p)
{
Name = n;
Phone = p;
}
}
static void TestDynamicLinq()
{
foreach (var x in new Person[] { new Person("Joe", "123") }.AsQueryable().Select("string.Format(\"{0} - {1}\", it.Name, it.Phone)"))
Console.WriteLine(x);
}