6

ASP.NET Web アプリケーションから送信された電子メールをデータベースに保持したいと考えています。アイデアは、電子メールの形式がデータベースに保存されるというものでした。

問題は、電子メールに注文固有の情報を含める必要があることです。たとえば、次のようになります。

ジョン・スミス様、ご注文ありがとうございます。

ご注文 1234 を受け取りました

私が達成しようとしているのは、次のように格納されるデータベース列の値に文字列の逐語を使用したことです。

{o.customer} 様、ご注文ありがとうございます。

ご注文 {o.id} を受け取りました

書式設定された文字列に値が既に含まれている場合に文字列補間を行うことができるかどうかに興味があります。使用しようとするString.Format(dbEmailString)と、例外がスローされます。

タイプ 'System.FormatException' の例外が mscorlib.dll で発生しましたが、ユーザー コードで処理されませんでした

追加情報: 入力文字列の形式が正しくありませんでした。

4

3 に答える 3

9

文字列補間はコンパイル時の機能です。通常のを使用して、必要なことを行うことができますString.Format

var formattedEmail = String.Format("Thank you for your order {0}, your order {1} has been received", o.customer, o.id);

さまざまな異なるプレースホルダーを値に置き換える必要がある場合は、おそらくより動的なテンプレート システムを探す必要があります。非常に基本的なものは で実行できますString.Replace

肝心なのは、このように格納された文字列からコード内の変数を直接参照することはできないということです。実行時に何らかの方法で文字列を処理する必要があります。

于 2016-07-13T15:16:37.533 に答える
0

C# 6 では、補間された文字列式は、式を含むテンプレート文字列のように見えます。String.Format() プレースホルダーのように見えますが、インデックスではなく、中括弧内の式そのものです。
C#6 の String.Format() は、コンパイラが舞台裏で String.Format() のように扱う構文糖衣のようです。

たとえば、vs 2015 で OP の式を表示するには:

class Program
{
    static void Main(string[] args)
    {

        dynamic order = new {customer = "Robert", id=123};
        PrintString(order);            
    }


    static void PrintString(dynamic o)
    {
        var exp1 = $"Thank you for your order { o.customer}";
        var exp2 = $"your order { o.id} has been received";
        Console.WriteLine(exp1);
        Console.WriteLine(exp2);

    }

}

出力は次のとおりです。

ご注文ありがとうございます ロバート

ご注文の 123 を受け取りました

上記の例で説明したように、データベースから書式設定された式を取得し、プレフィックスとして "$" を付けることができます。

VS 2013 では、新しいコンパイラを nuget パッケージとしてプロジェクトにインストールできます: Install-Package Microsoft.Net.Compilers

于 2016-07-13T18:03:24.657 に答える
-1

C# 6.0 の新機能のことだと思います: https://msdn.microsoft.com/en-us/library/dn961160.aspx

私はそれについて読んだだけで、まだ経験がありません。しかし、それは変数で動作する必要がcustomerありid、オブジェクトのプロパティで動作するかどうかはわかりません。

string customer = o.customer; int id = o.id; string msg = $"Thank you for your order {customer},your order {id} has been received";

正しい結果が得られます。(VS 2015 および .Net 4.6 が提供されます。)

string msg = $"Thank you for your order {o.customer}, your order {o.id} has been received";`

それはうまくいくかもしれません、私には手がかりがありません。

于 2016-07-13T15:47:35.817 に答える