Is it possible to include a C# variable in a string variable without using a concatenator?

冷暖自知 提交于 2020-01-01 04:37:10

问题


Does .NET 3.5 C# allow us to include a variable within a string variable without having to use the + concatenator (or string.Format(), for that matter).

For example (In the pseudo, I'm using a $ symbol to specify the variable):

DateTime d = DateTime.Now;
string s = "The date is $d";
Console.WriteLine(s);

Output:

The date is 4/12/2011 11:56:39 AM

Edit

Due to the handful of responses that suggested string.Format(), I can only assume that my original post wasn't clear when I mentioned "...(or string.Format(), for that matter)". To be clear, I'm well aware of the string.Format() method. However, in my specific project that I'm working on, string.Format() doesn't help me (it's actually worse than the + concatenator).

Also, I'm inferring that most/all of you are wondering what the motive behind my question is (I suppose I'd feel the same way if I read my question as is).

If you are one of the curious, here's the short of it:

I'm creating a web app running on a Windows CE device. Due to how the web server works, I create the entire web page content (css, js, html, etc) within a string variable. For example, my .cs managed code might have something like this:

string GetPageData()
    {
    string title = "Hello";
    DateTime date = DateTime.Now;

    string html = @"
    <!DOCTYPE html PUBLIC ...>
    <html>
    <head>
        <title>$title</title>
    </head>
    <body>
    <div>Hello StackO</div>
    <div>The date is $date</div>
    </body>
    </html>
    ";

}

As you can see, having the ability to specify a variable without the need to concatenate, makes things a bit easier - especially when the content increases in size.


回答1:


Almost, with a small extension method.

static class StringExtensions
{
    public static string PHPIt<T>(this string s, T values, string prefix = "$")
    {
        var sb = new StringBuilder(s);
        foreach(var p in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            sb = sb.Replace(prefix + p.Name, p.GetValue(values, null).ToString());
        }
        return sb.ToString();
    }
}

And now we can write:

string foo = "Bar";
int cool = 2;

var result = "This is a string $foo with $cool variables"
             .PHPIt(new { 
                    foo, 
                    cool 
                });

//result == "This is a string Bar with 2 variables"



回答2:


No, unfortunately C# is not PHP.
On the bright side though, C# is not PHP.




回答3:


No, it doesn't. There are ways around this, but they defeat the purpose. Easiest thing for your example is

Console.WriteLine("The date is {0}", DateTime.Now);



回答4:


string output = "the date is $d and time is $t";
output = output.Replace("$t", t).Replace("$d", d);  //and so on



回答5:


Based on the great answer of @JesperPalm I found another interesting solution which let's you use a similar syntax like in the normal string.Format method:

public static class StringExtensions
{
    public static string Replace<T>(this string text, T values)
    {
        var sb = new StringBuilder(text);
        var properties = typeof(T)
            .GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .ToArray();

        var args = properties
            .Select(p => p.GetValue(values, null))
            .ToArray();

        for (var i = 0; i < properties.Length; i++)
        {
            var oldValue = string.Format("{{{0}", properties[i].Name);
            var newValue = string.Format("{{{0}", i);

            sb.Replace(oldValue, newValue);
        }

        var format = sb.ToString();

        return string.Format(format, args);
    }
}

This gives you the possibility to add the usual formatting:

var hello = "Good morning";
var world = "Mr. Doe";
var s = "{hello} {world}! It is {Now:HH:mm}."
    .Replace(new { hello, world, DateTime.Now });

Console.WriteLine(s); // -> Good morning Mr. Doe! It is 13:54.



回答6:


The short and simple answer is: No!




回答7:


string.Format("The date is {0}", DateTime.Now.ToString())



回答8:


No, But you can create an extension method on the string instance to make the typing shorter.

string s = "The date is {0}".Format(d);



回答9:


string.Format (and similar formatting functions such as StringBuilder.AppendFormat) are the best way to do this in terms of flexibility, coding practice, and (usually) performance:

string s = string.Format("The date is {0}", d);

You can also specify the display format of your DateTime, as well as inserting more than one object into the string. Check out MSDN's page on the string.Format method.

Certain types also have overloads to their ToString methods which allow you to specify a format string. You could also create an extension method for string that allows you to specify a format and/or parse syntax like this.




回答10:


How about using the T4 templating engine?

http://visualstudiomagazine.com/articles/2009/05/01/visual-studios-t4-code-generation.aspx




回答11:


If you are just trying to avoid concatenation of immutable strings, what you're looking for is StringBuilder.

Usage:

string parameterName = "Example";
int parameterValue = 1;
Stringbuilder builder = new StringBuilder();
builder.Append("The output parameter ");
builder.Append(parameterName);
builder.Append("'s value is ");
builder.Append(parameterValue.ToString());
string totalExample = builder.ToString();



回答12:


Since C# 6.0 you can write string "The title is \{title}" which does exactly what you need.




回答13:


Or combined:

Console.WriteLine("The date is {0}", DateTime.Now);

Extra info (in response to BrandonZeider):

Yep, it is kind-a important for people to realize that string conversion is automatically done. Manually adding ToString is broken, e.g.:

string value = null;
Console.WriteLine("The value is '{0}'", value); // OK
Console.WriteLine("The value is '{0}'", value.ToString()); // FAILURE

Also, this becomes a lot less trivial once you realize that the stringification is not equivalent to using .ToString(). You can have format specifiers, and even custom format format providers... It is interesting enough to teach people to leverage String.Format instead of doing it manually.



来源:https://stackoverflow.com/questions/5640223/is-it-possible-to-include-a-c-sharp-variable-in-a-string-variable-without-using

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!