Generate the name of a computer from its properties I am writing a small application to generate the domain name of computers, from their known properties, and business rules.
My Asset class is:
public enum AssetSite
{
    Rotterdam,
    Sydney,
}

public class Asset
{
/// &lt;summary&gt;
/// Gets the Asset Tag of the asset.
/// &lt;/summary&gt;
public string AssetTag { get;}

/// &lt;summary&gt;
/// Gets the site to which the asset belongs.
/// &lt;/summary&gt;
public AssetSite AssetSite { get; } 

/// &lt;summary&gt;
/// Gets a value indicating whether the asset is a laptop.
/// &lt;/summary&gt;
public bool IsLaptop { get; }   

/// &lt;summary&gt;
/// Gets the name of the asset.
/// &lt;/summary&gt;
public string Name
{
    get
    {
        var nameBuilder = new StringBuilder();
        nameBuilder.Append('I'); // Convention: All names start with I
        
        // Second letter indicates the location of the PC.
        if (this.AssetSite == AssetSite.Sydney)
        {
            nameBuilder.Append('S');
        }
        else if (this.AssetSite == AssetSite.Rotterdam)
        {
            nameBuilder.Append('R');
        }
        else
        {
            throw new ArgumentOutOfRangeException(&quot;Invalid site&quot;);
        }
        
        nameBuilder.Append(&quot;PC&quot;); //Then, all PCs have 'PC' in their name.

        if (this.IsLaptop)
        {
            nameBuilder.Append(&quot;L&quot;); //Laptops get a &quot;L&quot; in their name
        }
        else
        {
            nameBuilder.Append(&quot;D&quot;); //Desktops get a &quot;D&quot;
        }

        nameBuilder.Append(this.AssetTag); //Unique identifier of the computer

        return nameBuilder.ToString();
    }
}

Asset objects are created through the deserialization of a JSON file
I am worried about my implementation of the Name getter. It feels way too long and complex, but at the same time, extracting each letter generation to a dedicated method feels way to complex as well.
My main concerns here are readability and maintainability.
I would highlight two things:

It is not really common to throw exception inside a property getter
Because the Name has only just a getter then you can consider to expose it as a method instead.

From implementation point of you, you can improve readability if you do something like this:
var nameBuilder = new StringBuilder();
nameBuilder.Append('I'); 

var siteWhitelist = new AssetSite[] { AssetSite.Sydney, AssetSite.Rotterdam };
if (!siteWhitelist.Contains(this.AssetSite))
    throw new ArgumentOutOfRangeException(&quot;Invalid site&quot;);

string site = this.AssetSite switch
{
    AssetSite.Sydney    =&gt; &quot;S&quot;;
    AssetSite.Rotterdam =&gt; &quot;R&quot;; 
};

nameBuilder.Append(site);
nameBuilder.Append(&quot;PC&quot;); 

string computerType = this.IsLaptop ?  &quot;L&quot; : &quot;D&quot;;

nameBuilder.Append(computerType)
nameBuilder.Append(this.AssetTag);

return nameBuilder.ToString();

Of course you can further improve it, by introducing a Dictionary&lt;AssetSite, string&gt; where you can store the mapping between sites and letters.