iT邦幫忙

0

xml內字串包含C#變數如何讀取?

c#
deh 2019-11-04 13:38:572560 瀏覽
  • 分享至 

  • xImage

xml內(app.config)有

<add key="MailBody" value="單位:{DepartmentName}" />

C#讀取

var temp = System.Configuration.ConfigurationManager.AppSettings["MailBody"];
mailForm.MailBody = $"{temp}";

整串如果都在C#內會是下面這樣(DepartmentName為code內的變數)

mailForm.MailBody = $"單位:{DepartmentName}";

預期能呈現

單位:業務部

都在C#內的話,結果就如預期般的
但從app.config讀取的話

單位:{DepartmentName}

$ 特殊字元未起到作用

有什麼辦法可以讀取變數嗎?

YoChen iT邦研究生 1 級 ‧ 2019-11-04 14:06:20 檢舉
我有個疑問,既然你的變數都寫在code當中了,怎麼還會想要把它拆到config裡面呢~XDDD
米歐 iT邦新手 3 級 ‧ 2019-11-04 14:13:38 檢舉
+1 XDD
deh iT邦研究生 1 級 ‧ 2019-11-04 14:25:39 檢舉
希望完成後若要變動,只要改app.config就好,不用再動程式
MailBody是整串mail的內容,只是方便呈現問題所以只留下一個變數啦XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
YoChen
iT邦研究生 1 級 ‧ 2019-11-04 16:15:44
最佳解答

首先,由於Config屬於文字檔,無論用什麼方法,您只能從Config獲得字串

如果您想要透過字串搜尋變數,您可以參考sion大提供的作法的作法,透過Reflection,不過這個做法有個缺點,您還是必須在Config針對變數設定對應的key-value,不然您很難切出對應的變數

我個人是建議,如果您要這樣做的話,可能用String.Replace會比較簡單,e.g.

app.config

<add key="MailBody" value="單位:{DepartmentName}" />

Main.cs

string temp = System.Configuration.ConfigurationManager.AppSettings["MailBody"];
mailForm.MailBody = temp.Replace("{DepartmentName}", DepartmentName);
deh iT邦研究生 1 級 ‧ 2019-11-04 16:32:26 檢舉

單一變數用String.Replace真的快多了!
不過我的實際狀況是有很多變數。
最後(在看到大大回復前)用一個html裝email的內容
讀內容後string.Format解決

sion iT邦新手 4 級 ‧ 2019-11-04 17:33:45 檢舉

既然如此,何必拘泥在config呢?
一樣讀取文字檔的話
用json不是比較方便嗎?
結構上也比較適合多變數

deh iT邦研究生 1 級 ‧ 2019-11-04 17:44:34 檢舉

也是
一開始是想說已有config就用config就好

1
sion
iT邦新手 4 級 ‧ 2019-11-04 13:55:03

因為你的$是作用在temp上阿
如果要動態抓變數的話要用reflection
<add key="MailBody" value="DepartmentName" />

public string DepartmentName;
///////////////
var temp = System.Configuration.ConfigurationManager.AppSettings["MailBody"];
var result = this.GetType().GetField(temp).GetValue(this);
deh iT邦研究生 1 級 ‧ 2019-11-04 14:23:00 檢舉

感謝,我去看一看reflection

2
米歐
iT邦新手 3 級 ‧ 2019-11-04 14:13:14

$ 是 C# 的語法糖,實際上編譯後還是轉成string.Format,並不是 $ 不起作用,而是你誤解了他的用法,如果你想要讓他產生作用,可以改用string.Format

看更多先前的回應...收起先前的回應...
deh iT邦研究生 1 級 ‧ 2019-11-04 14:31:43 檢舉

有嘗試用string.Format
但那格式沒辦法放到

小魚 iT邦大師 1 級 ‧ 2019-11-04 16:03:55 檢舉

不過string.Format的用法不一樣,
也許可以考慮自己寫!?

deh iT邦研究生 1 級 ‧ 2019-11-04 16:22:59 檢舉

後來發現不論是string.Format還是$都無法用在runtime,最後自己寫解決...

米歐 iT邦新手 3 級 ‧ 2019-11-04 17:39:23 檢舉

我講錯東西了QQ,我想到的東西是 YoChen 說的 replace,像這樣

var mailBody = "單位:@DepartmentName";
var departmentNameA = "A部門";
var other = "其他條件";

var parameters = new Dictionary<string, object>();
parameters.Add("@DepartmentName", departmentNameA);
parameters.Add("@other", other);

var result = parameters.Aggregate(mailBody, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString()));
米歐 iT邦新手 3 級 ‧ 2019-11-04 17:47:21 檢舉

不然你也可以參考這個套件 https://github.com/axuno/SmartFormat

1
小魚
iT邦大師 1 級 ‧ 2019-11-04 14:19:44

你如果是要用共用變數的話,
可以另外寫一個Class來放變數啊.

deh iT邦研究生 1 級 ‧ 2019-11-04 14:24:44 檢舉

寫在app.config,是希望完成後若要變動,只要改app.config就好,不用再動程式
MailBody是整串mail的內容,只是方便呈現問題所以只留下一個變數啦XD

小魚 iT邦大師 1 級 ‧ 2019-11-04 16:03:02 檢舉

印象中, app.config裡面放的應該是常數不是變數.

我要發表回答

立即登入回答