2013-08-12 153 views
3

我有一個XML文件,我希望允許最終用戶設置字符串的格式。在運行時設置String.Format

例如:

<Viewdata> 
<Format>{0} - {1}</Format> 
<Parm>Name(property of obj being formatted)</Parm> 
<Parm>Phone</Parm> 
</Viewdata> 

所以在運行時我會以某種方式將其轉換成一個String.Format("{0} - {1}", usr.Name, usr.Phone);

這甚至可能嗎?

+1

我想像有可能與反思,但是這聽起來像一個XY問題 – Sayse

回答

2

當然。格式字符串就是那個字符串。

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); 

請小心,因爲您的最終用戶可能會破壞程序。不要忘記FormatException

+1

的姓名和電話似乎是一個財產所以不認爲這會起作用(我的第一個想法) – Sayse

+0

@Sayse:你仍然可以在「用戶」類中做到這一點。或者只是調用'String.Format(fmt,usr.Name,usr.Phone)'。 –

+1

是的,但我想象的是需要更通用的東西(其中該領域未知) – Sayse

0
XElement root = XElement.Parse (
@"<Viewdata> 
<Format>{0} - {1}</Format> 
<Parm>damith</Parm> 
<Parm>071444444</Parm> 
</Viewdata>"); 


var format =root.Descendants("Format").FirstOrDefault().Value; 

var result = string.Format(format, root.Descendants("Parm") 
            .Select(x=>x.Value).ToArray()); 
+0

他希望params數組在像用戶這樣的對象上被調用 – phillip

0

簡短的回答是肯定的,但它取決於你的格式化選項的多樣性它將是多麼困難。

如果您有一些接受5參數的格式化字符串,而另一些只接受3則需要考慮這些參數。

我會解析XML的參數,並將它們存儲到對象數組傳遞給String.Format函數。

1

我同意其他海報誰說你可能不應該這樣做但這並不意味着我們不能玩這個有趣的問題。所以首先,這個解決方案是半成熟/粗糙但是如果有人想要建立它,這是一個好的開始。

我寫了LinqPad,我喜歡Dump()可以用控制檯writelines替換。

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; } 
} 
0

您可以使用System.Linq.Dynamic,使整個format命令編輯:

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); 
}