¿Se puede almacenar la plantilla de una cadena en una variable y usar la interpolación en ella?
var name = "Joe"; var template = "Hi {name}";Entonces quiero hacer algo como:
var result = $template;La razón es que mis plantillas vendrán de una base de datos.
Supongo que estas cadenas tendrán siempre el mismo número de parámetros, incluso si pueden cambiar. Por ejemplo, template de hoy es "Hi {name}" y mañana podría ser "Hello {name}" .
Respuesta corta: No, no puedes hacer lo que te has propuesto.
Alternativa 1: use el método string.Format .
Puede almacenar en su base de datos algo como esto:
"Hi {0}"Luego, cuando recupere la plantilla de cadena de la base de datos, puede escribir:
var template = "Hi {0}"; //retrieved from db var name = "Joe"; var result = string.Format(template, name); //now result is "Hi Joe"Con 2 parámetros:
var name2a = "Mike"; var name2b = "John"; var template2 = "Hi {0} and {1}!"; //retrieved from db var result2 = string.Format(template2, name2a, name2b); //now result2 is "Hi Mike and John!"Alternativa 2: use un marcador de posición.
Puede almacenar en su base de datos algo como esto:
"Hi {name}"Luego, cuando recupere la plantilla de cadena de la base de datos, puede escribir:
var template = "Hi {name}"; //retrieved from db var name = "Joe"; var result = template.Replace("{name}", name); //now result is "Hi Joe"Con 3 parámetros:
var name2a = "Mike"; var name2b = "John"; var template2 = "Hi {name2a} and {name2b}!"; //retrieved from db var result2 = template2 .Replace("{name2a}", name2a) .Replace("{name2b}", name2b); //now result2 is "Hi Mike and John!" Preste atención a qué token elige para sus marcadores de posición. Aquí usé corchetes circundantes {} . Debe encontrar algo que sea poco probable que cause colisiones con el resto de su texto. Y eso depende completamente de su contexto.
Esto se puede hacer según lo solicitado mediante la compilación dinámica, como a través del paquete Microsoft.CodeAnalysis.CSharp.Scripting . Por ejemplo:
var name = "Joe"; var template = "Hi {name}"; var result = await CSharpScript.EvaluateAsync<string>( "var name = \"" + name + "\"; " + "return $\"" + template + "\";");Tenga en cuenta que este enfoque es lento y necesitaría agregar más lógica para manejar el escape de comillas (y los ataques de inyección) dentro de las cadenas, pero lo anterior sirve como prueba de concepto.
No, no puede hacer eso ya que necesita el valor del name en el momento en que se crea la cadena (tiempo de compilación). Considere usar String.Format o String.Replace en su lugar.