2013-11-12

I am a developer by trade so am very used to using generics and reflection in C#, however, today I was faced with trying to grab an ‘SPPersistedObject’ from the ‘SPFarm.Local.Services.GetValue<T>()’ method.

So, in C# I wanted to do this :

Microsoft.Practices.SharePoint.Common.Logging.DiagnosticsService msDiagnosticService = SPFarm.Local.Services.GetValue<Microsoft.Practices.SharePoint.Common.Logging.DiagnosticsService>("clbDiagnosticService");
if (msDiagnosticService != null)
{
msDiagnosticService.Delete();
}

The above is removing a logger called ‘clbDiagnosticService’ if one exists. The problem line comes on the method ‘GetValue’ as that takes a generic type..

So, after a bit of “Googling” + trial and error .. the final Powershell looks like this :

and in code for those that want to copy and modify it :

# First load object models 
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.Practices.SharePoint.Common”)
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”)

$farm = [Microsoft.SharePoint.Administration.SPFarm]::Local

# Now we need to use Reflection to get the "GetValue" method..
$method = [Microsoft.SharePoint.Administration.SPServiceCollection].GetMethod("GetValue", [string])

Try
{
 $closedmethod =  $method.MakeGenericMethod[Microsoft.Practices.SharePoint.Common.Logging.DiagnosticsService]) 

 # get the service!
 $service = $closedmethod.Invoke($farm.Services,"clbDiagnosticService")

  # Do your stuff here...
 if ($service) 
 {
  Write-host $service.Id 
 }
}
Catch
{
  "Collaboris Logger Not Found - Stopping." 
}

Hope this helps!

 

About the author 

Mark Jones

Collab365 Founder helping people learn Microsoft 365 via these:

👉 Collab365 Summits - Massive virtual conferences for Microsoft products
👉 Collab365 Today - Aggregation site for the best community blogs
👉 Collab365 Community - Huge blog site including plenty of Microsoft content

I want to provide a friendly online community, where we can learn and grow together:

👉 365ers - coming very soon!