Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时设置String.Format_C# - Fatal编程技术网

C# 在运行时设置String.Format

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 =

我有一个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 = "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);
}