2013-06-10 15 views
5

Mam moduł do wysyłania wiadomości z SMS-em. Mogę umieścić zmienną w łańcuchu, jeśli wiadomość jest statyczna, ale użytkownik żąda, aby wiadomość mogła zostać zmieniona bez względu na to, czego chce.Zmienna w ciągu dynamicznym w C#

Stworzyłem tę zmienną

  1. NazwaFirmy
  2. CustomerName
  3. BillNumber
  4. Płatność

Przykład:

Od {Firma}. Cześć/Pani {CustomerName}, Twój numer rachunku to {Numer BillNumber} z całkowitą płatnością w wysokości {Payment}. Chcemy Cię poinformować , że przedmioty zostały ukończone i gotowe do odbioru.

Mój obecny kod jest praca dla wiadomości statycznej

string messageSms = "From " +Company+ ". Hi Mr/Mrs "+{CustomerName}+", your bill number is "+{BillNumber}+" with a total payment of "+{Payment}+". We want to inform you the items has been completed and ready for collection."; 

Ale jak można zrobić z dynamicznym wiadomości? Jak mogę wykryć zmienną w łańcuchu i ustawić dane na zmiennej?

Podążam też za tym article, ale nie pomagam tak bardzo.

+1

można podać przykład pożądanego wejścia/wyjścia? – pascalhein

+0

Czy możesz wyjaśnić więcej na temat sprawy, którą chcesz obsłużyć? – Mzf

Odpowiedz

5

Zakładając, że rozumiem, myślę, że klasa String.Inject może być pomocna. Obraz nazwany String.Format:

"Hello, {company}!".Inject(new { company = "StackOverflow" }); 
// "Hello, StackOverflow!" 

Drugą korzyścią jest to, można mieć zakodowane modelu i odniesienie bezpośrednie właściwości niego. na przykład

class Contact 
{ 
    string FirstName; 
    string LastName; 
} 

String greeting = "Mr. {FirstName} {LastName}, Welcome to the site ..."; 
String result = greeting.Inject(new Contact 
{ 
    FirstName = "Brad", 
    LastName = "Christie" 
}); 
+1

+1, bardzo elegancki. –

+0

Czy mogę wiedzieć, jaki framework umożliwia korzystanie z właściwości String.Inject? Używam wersji 3.5, gdzie właściwość String.Inject nie jest dostępna – Chuki2

+0

@ Chuki2: Musisz umieścić na stronie [klasa] (http://austegard.googlepages.com/StringInjectExtension.cs) wymienioną w projekcie, następnie dodaj go jako instrukcję 'using'. –

4
var newString = messageSms.Replace("{Company}", CompanyName) 
          .Replace("{CustomerName}", CustomerName) // ...etc 

Należy to zrobić.

0

Spróbuj String.Format sposobem, na przykład:

string messageSms = String.Format("From {0}. Hi ..{1}, Your..{2} with..{3}. We..", 
            CompanyName, CustomerName, BillNumber, Payment); 
+1

To nie pasuje do wymaganego parametru OP "OPCJE". –

+0

Tak, to prawda, jako programista łatwe do zrozumienia, ale nie dla użytkownika. Dlatego potrzebuję użyć nazwanego parametru. Przy okazji, dzięki za pomoc. – Chuki2

0

Zakładam, że najprostszym sposobem osiągnięcia tego celu (ty nie wyjaśnić swoje pytanie) jest użycie string.Format(). Wystarczy użyć go tak:

string company = ...; 
string name= ...; 
string billNr= ...; 
string payment= ...; 
string output = string.Format("From {0}. Hi Mr/Mrs {1}, your bill number is {2} with a total payment of {3}. We want to inform you the items has been completed and ready for collection.", company, name, billNr, payment); 
+0

kolejność jest ustalona w tym przypadku .. – Amitd

+0

Dla użytkownika, w ten sposób nie jest przyjazny i może wprowadzić w błąd. Dzięki za pomoc – Chuki2

0

Dlaczego nie użyć StringBuilder zamiast?

StringBuilder stringBuilder = new StringBuilder("From {Company}.Hi Mr/Mrs {CustomerName}, your bill number is {BillNumber} with a total payment of {Payment}. We want to inform you the items has been completed and ready for collection."); 
stringBuilder.Replace("{Company}",CompanyName); 
stringBuilder.Replace("{CustomerName}",CustomerName); 
stringBuilder.Replace("{BillNumber}",BillNumber); 
stringBuilder.Replace("{Payment}",Payment); 
string messageSms = stringBuilder.ToString(); 
0

Aby utworzyć rozwiązanie wielokrotnego użytku, można rozpocząć od zadeklarowania obiektu zawierającego wartości zastępcze jako właściwości. W tym przypadku po prostu zadeklarować anonimową obiektu, ale to normalna klasa będzie działać tak samo dobrze:

var data = new { 
    Company = "Stack Overflow", 
    CustomerName = "Martin Liversage", 
    BillNumber = 123456, 
    Payment = 1234.567M.ToString("N2") 
}; 

Notic jak ja „oszustwo” i przypisać ciąg Payment.Formatowanie daty i godziny jest zawsze skomplikowane i zdecydowałem się na formatowanie z góry, gdy deklaruję obiekt danych. Zamiast tego można sformułować mniej lub bardziej rozbudowane reguły formatowania w mechanizmie formatującym.

Mając obiektu danych o właściwościach mogę zbudować słownik par nazwa/wartość:

var dictionary = data 
    .GetType() 
    .GetProperties() 
    .ToDictionary(
    propertyInfo => propertyInfo.Name, 
    propertyInfo => propertyInfo.GetValue(data, null) 
); 

Zakładając, że format zawiera szablon formatowania jest to po prostu kwestia zapętlenie nad elementami w słowniku, aby utworzyć ciąg wymiana:

var buffer = new StringBuilder(format); 
foreach (var name in dictionary.Keys) { 
    var value = dictionary[name].ToString(); 
    buffer.Replace("{" + name + "}", value); 
} 
var message = buffer.ToString(); 
1

można również użyć interpolated strings użyciu C# 6.0

var messageSms = $"From {companyName}. Hi {customerName}, your bill number is {billNumber} with a total payment of {payment}."; 
0

Chciałbym zbliżyć się z następujących czynności:

string Company; 
string CustomerName; 
string BillNumber; 
string Payment; 

string messageSms = [email protected]" 
From {Company}. Hi Mr/Mrs {CustomerName}, your bill number is {BillNumber} 
with a total payment of {Payment}. We want to inform you the items has been 
completed and ready for collection. 
";