title: Powershell: Dynamically gather data types for IIS configuration element validation
body: <p>I'm attempting to dynamically use the Microsoft.Web.Administration namespace within a powershell cmdlet.</p>
  
  <p>Is there a way to add a variable into a Namespace.Class declaration.</p>
  
  <p>I'm using the namespace [Microsoft.Web.Administration] and it's class [Microsoft.Web.Administration.ApplicationPool], it has a property under it 'Recycling' that you can access using a GetProperty method.</p>
  
  <pre><code>[Microsoft.Web.Administration.ApplicationPool].GetProperty("Recycling")
  </code></pre>
  
  <p>If you spit out the PropertyType of the above using this</p>
  
  <pre><code>[Microsoft.Web.Administration.ApplicationPool].GetProperty("Recycling").PropertyType.FullName
  </code></pre>
  
  <p>You get this result, </p>
  
  <blockquote>
    <p>Microsoft.Web.Administration.ApplicationPoolRecycling</p>
  </blockquote>
  
  <p>which is another class. I now want to access this class dynamically within the cmdlet. How do access this class from within the code, I want the code to dynamically discover the new class of the object and then access that class. But I can't find a way to accomplish this.</p>
  
  <p>Psuedocode for what I'm trying</p>
  
  <pre><code>[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" )
  $appPoolProperty = [Microsoft.Web.Administration.ApplicationPool].GetProperty($Property)
  $subClassName = $appPoolProperty.PropertyType.FullName
  
  #This is the step I'm lost on
  $subClass = New-Object $subClassName
  </code></pre>
  
  <p>So I'm not sure if there's a way to have a TypeName for an object put in as a string value and I can't seem to find a way to cast the variable as anything else. Sorry if this is remedial, I'm a basement grown coder and just learn things as I go.</p>
  
  <p>EDIT: As requested by Mathias below in the comments, an overview of what I'm trying to achieve.</p>
  
  <p>I have a script that automates the configuration of many IIS components. At this time I'm attempting to add validation to the cmdlet Set-AppPoolConfiguration that I've created that allows a configuration to be fed into the cmdlet that configures an AppPool (this is used to deploy websites/weapplications throughout a distributed web environment). Utilizing the details inside the Microsoft.Web.Administration I'm able to get enum values, as well as types of the many configuration components of an AppPool. This is saving me time to where I don't have to hard code in the data types and can just dynamically discover them and do validation on the values when the specific configuration element is chosen.</p>
  
  <p>For example. If an AppPool Recycle schedule is need to be configured, I need to validate it against a TimeSpan data type. If it is not a TimeSpan data type issues will arise when being added to the ScheduleCollection. So I'm looking to validate the value provided before attempting to add it.</p>
  
  <p>Since there are many AppPool configuration elements, I don't want to have to create a massive switch or if/elseif chain that checks each configuration element and statically dictate what data type it is for validation. I want the class itself to dynamically provide this information to simplify the code.</p>
  
  <p>I can get the majority of these data types by simply accessing the property chain within the namespace. For example, if you want to know what type is required for the QueueLength, use this:</p>
  
  <pre><code>[Microsoft.Web.Administration.ApplicationPool].GetProperty("QueueLength").PropertyType.Name
  </code></pre>
  
  <p>And you'll get Int64. </p>
  
  <p>It's also extremely useful for getting enums.</p>
  
  <pre><code>[Microsoft.Web.Administration.ApplicationPool].GetProperty("ManagedPipelineMode").PropertyType.GetEnumNames()
  </code></pre>
  
  <p>However attempting this with Schedule and you run into a small issue as it returns ScheduleCollection. This is true of any of the configuration elements that are part of a collection.</p>
  
  <pre><code>[Microsoft.Web.Administration.ApplicationPool].GetProperty("Recycling").PropertyType.GetProperty('PeriodicRestart').PropertyType.GetProperty('Schedule').PropertyType.Name
  </code></pre>
  
  <p>However the knowledge that the schedule item inside the ScheduleCollection is only accessible from within the Schedule class. My code currently checks to see if it is a collection, and then if it is, it is attempting to access that collection/class and get the information that is required. To find out that schedule is a TimeSpan you have to access it's specific class instance:</p>
  
  <pre><code>[Microsoft.Web.Administration.Schedule].GetProperty('Time').PropertyType.Name
  </code></pre>
  
  <p>Now AppPools are simple, there's only a single collection group that is normally edited, so hard coding in that if you're attempting to set a new recycle schedule it will be a TimeSpan isn't that big of a deal, however when we move over to WebSite/WebApplication configurations, it becomes more tedious to statically declare data types for each configuration element that is part of a collection, and becomes more useful to try and discover these dynamically based on the configuration element selected.</p>
  
  <p>This was my initial approach, I just included the above for clarity. I'm going to step back and take another look at how to attack this as this does not appear to be as easy as I had hoped, I'll post my solution here.</p>