Skip to content

Don’t Repeat Your Biml – C# Extension Methods

Don't Repeat Your Biml - C# Extension Methods

In a previous blog post, we looked at how to use C#/VB Code Files in Biml. There are several benefits to moving custom C# code into separate files. It allows you to reuse that code across multiple projects and solutions. You can maintain the code in your editor of choice, taking advantage of intellisense and syntax highlighting. And finally, my personal favorite: you can create custom extension methods.

In this post, we will look at how to simplify our Biml projects by creating and using C# extension methods. We will build on the examples from the previous C#/VB Code Files in Biml blog post.

C# Extension Methods in Biml

But first, what are extension methods? In short, you can add your own custom methods to existing objects, without modifying the original object. The extension method will look like it belongs to that object, just like any other built-in method. You can almost think of extension methods as add-ins or plugins to the core Biml language :)

<!-- Did you know that GetBiml() is actually an extension method? You can call it like this: -->
<!-- You can call custom extension methods in the same way: -->

So how do we create an extension method?

Example: From Helper Methods to Extension Methods

In the previous C#/VB Code Files in Biml blog post, we created the following code file with a helper class and helper method:

NamingStandards.cs – Helper Class and Helper Method:

using Varigence.Languages.Biml.Table;
public static class NamingStandards {
  public static string GetTableName(AstTableNode table) {
    return table.Schema.Name.ToUpper() + "_" + table.Name.ToUpper();

To use this helper method, we first had to specify the name of the Helper class, then pass in the table as a parameter:


This works perfectly, but it is not the prettiest solution. We can do better! Let’s turn this helper method into an extension method. All we have to do is add the this modifier to the first parameter, where the first parameter is the object you’re creating the extension method for:

NamingStandards.cs – Extension Method:

using Varigence.Languages.Biml.Table;
public static class NamingStandards {
  public static string GetTableName(this AstTableNode table) {
    return table.Schema.Name.ToUpper() + "_" + table.Name.ToUpper();

That’s it! I promise! Yes, it really is as simple as… this ;) Anyway!

Now that we have our updated code file and a reference to it, we can use the new extension method without having to worry about which class it belongs to:

<#@ code file="NamingStandards.cs" #>
<Biml xmlns="">
    <# foreach (var table in RootNode.Tables) { #>
      <Package Name="<#=table.GetTableName()#>" ConstraintMode="Linear">
          <ExecuteSQL Name="Truncate <#=table.GetTableName()#>" ConnectionName="Destination">
            <DirectInput>TRUNCATE TABLE dbo.<#=table.GetTableName()#>
          <Dataflow Name="Load <#=table.GetTableName()#>">
              <OleDbSource Name="Source <#=table.SsisSafeScopedName#>" ConnectionName="Source">
                <ExternalTableInput Table="<#=table.SchemaQualifiedName#>" />
              <OleDbDestination Name="Destination <#=table.GetTableName()#>" ConnectionName="Destination">
                <ExternalTableOutput Table="dbo.<#=table.GetTableName()#>" />
    <# } #>


In this post, we looked at how to turn a helper class and helper method into an extension method. By adding the keyword this, we can call the extension method on an object, instead of calling the helper method and passing in the object as a parameter.

About the Author

Cathrine Wilhelmsen is a Microsoft Data Platform MVP, BimlHero Certified Expert, Microsoft Certified Solutions Expert, international speaker, author, blogger, and chronic volunteer who loves teaching and sharing knowledge. She works as a Senior Business Intelligence Consultant at Inmeta, focusing on Azure Data and the Microsoft Data Platform. She loves sci-fi, chocolate, coffee, craft beers, ciders, cat gifs and smilies :)


Hi! This is Cathrine. Thank you so much for visiting my blog. I'd love to hear your thoughts, but please keep in mind that I'm not technical support for any products mentioned in this post :) Off-topic questions, comments and discussions may be moderated. Be kind to each other. Thanks!

Share Your Thoughts?