<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Media And Microcode : Reflection</title><link>http://blogs.msdn.com/mediaandmicrocode/archive/tags/Reflection/default.aspx</link><description>Tags: Reflection</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Microcode: PowerShell Scripting Tricks - Exploring .NET Types with a Get-Type function and Reflection</title><link>http://blogs.msdn.com/mediaandmicrocode/archive/2008/10/23/microcode-powershell-scripting-tricks-exploring-net-types-with-a-get-type-function-and-reflection.aspx</link><pubDate>Fri, 24 Oct 2008 01:16:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9014243</guid><dc:creator>JamesBrundage</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mediaandmicrocode/comments/9014243.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mediaandmicrocode/commentrss.aspx?PostID=9014243</wfw:commentRss><description>&lt;p&gt;There's a simple yet powerful function that nearly everyone on the PowerShell team has written a version of.&amp;#160; My version is called Get-Type.&amp;#160; It's only a one-liner, but it's an amazing way to explore .NET and it's also an amazing example of some of the things you can do with the object pipeline.&amp;#160; What my version does is get all of the existing .NET types loaded in the current program.&amp;#160; In this post, I'll introduce the basic function, and I'll build upon it in order to show some cool things you can do with .NET reflection.&amp;#160; I first introduced this function in the &lt;a href="http://blogs.msdn.com/powershell/archive/2008/05/23/wpf-powershell-part-2-exploring-wpf-and-the-rest-of-net-with-scripts.aspx"&gt;2nd post of my series on WPF&lt;/a&gt;, but I didn't really show that much .NET fun with it.&lt;/p&gt;  &lt;p&gt;Here's a simple version:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function Get-Type() {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [AppDomain]::CurrentDomain.GetAssemblies() |&amp;#160; Foreach-Object { $_.GetTypes() }       &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Go ahead and run it.&amp;#160; Running it on CTP2 of Graphical PowerShell on my home box, I got 19303 .NET types.&amp;#160; That's over 19000 things you can build upon.&amp;#160; 19000 potential solutions sitting right there at your fingertips.&amp;#160; A remarkable amount of information can be gleaned just looking directly at the types, and it's a lot faster than looking it up on MSDN (although MSDN is a great companion to this knowledge).&lt;/p&gt;  &lt;p&gt;How I figured out there were 19303 .NET types is a great example of the object pipeline:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Get-Type | Measure-Object&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;But that's only scratching the surface of what we can do with the rich data of .NET and PowerShell's powerful object pipeline.&lt;/p&gt;  &lt;p&gt;Let's suppose that I want to find every Xml-related type:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Get-Type | ? { $_.Name -like &amp;quot;*Xml*&amp;quot; } &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now suppose I want to find the constructors of the constructors of the objects:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Get-Type | ? { $_.Name -like &amp;quot;*Xml*&amp;quot; } | % { $_.GetConstructors() }&amp;#160; | %&amp;#160; { &amp;quot;$_&amp;quot; }&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now suppose I want to check out what each constructor can do:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Get-Type | ? { $_.Name -like &amp;quot;*Xml*&amp;quot; } | % { $_.GetConstructors() } | Get-Member&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Looking at this, I can see that constructors contain a GetParameters() method.&amp;#160; Let's put that together with Get-Type to build something that will find all of the types that I can build using that type.&lt;/p&gt;  &lt;p&gt;function Search-Constructor([Type]$parameterType, $namespace) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Get-Type |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Where-Object { $_.Namespace -like &amp;quot;*$namespace*&amp;quot; } |&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Where-Object {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_.GetConstructors() |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Foreach-Object {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_.GetParameters() |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where-Object {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_.ParameterType -eq $parameterType     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;It will probably take a little bit to run (on my machine, it took about 30 seconds to find anything that used XmlDocument in its constructor, with no namespace specified) , but you can easily use this to start discovering how .NET types interact.&lt;/p&gt;  &lt;p&gt;Similar functions will let you find Properties, Events, and Methods:&lt;/p&gt;  &lt;p&gt;function Search-Method([Type]$parameterType, $namespace) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Get-Type |&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Where-Object { $_.Namespace -like &amp;quot;*$namespace*&amp;quot; } |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Where-Object {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_.GetMethods() |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Foreach-Object {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_.GetParameters() |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Where-Object {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $_.ParameterType -eq $parameterType     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;If you want to check out any property, just use Select-Object to view the type.&amp;#160; (You can also summarize the object by adding hashtables, for instance, this expression will output each type's fullname and all of their methods:&lt;/p&gt;  &lt;p&gt;Get-Type | Select-Object FullName, @{Name='Methods';Expression={$_.GetMethods() | % {$_.ToString()}}}&lt;/p&gt;  &lt;p&gt;This is a great example of the usefulness of the Object pipeline.&amp;#160; Instead of getting a list of all of the typenames, you can delve deep into the what a type can do for you.&amp;#160; The more you explore .NET.&amp;#160; These little snippets should help get you started, but the sky's the limit.&amp;#160; Try writing a few of your own. The more you explore .NET, the more you'll be amazed at the variety of code that exists to solve your everyday programming problems.&lt;/p&gt;  &lt;p&gt;Hope this helps,&lt;/p&gt;  &lt;p&gt;James Brundage [MSFT]&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9014243" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/Microcode/default.aspx">Microcode</category><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/Select-Object/default.aspx">Select-Object</category><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/Scripting+Tricks/default.aspx">Scripting Tricks</category><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/Where-Object/default.aspx">Where-Object</category><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/Get-Type/default.aspx">Get-Type</category><category domain="http://blogs.msdn.com/mediaandmicrocode/archive/tags/Reflection/default.aspx">Reflection</category></item></channel></rss>