This article describes the operation of a method-based static code analyzer for .NET that constructs in-memory method call networks of compiled assemblies. You will also see a concrete application of static code analysis to generate a website providing easy insights on a sample application.
- codeanalyzerandtodosample.zip
- CodeAnalyzer and Sample Solution.sln
- Generate.cmd
- Generator
- Output
- Blank.html
- co_CreateToDoItem(int,string,Nullable[DateTime])_ToDoItem.html
- co_DeleteToDoItem(int)_void.html
- co_FindUserByName(string)_User.html
- co_GetToDoItem(int)_ToDoItem.html
- co_GetUser(int)_User.html
- co_ListAllToDoItems()_IEnumerable[ToDoItem].html
- co_ListAllUsers()_IEnumerable[User].html
- co_ListDoneItemsForUser(int)_IEnumerable[ToDoItem].html
- co_ListToDoItemsForUser(int)_IEnumerable[ToDoItem].html
- co_ListUsersMatching(string)_IEnumerable[User].html
- co_MarkToDoItemDone(int)_void.html
- co_UpdateToDoItem(int,string,Nullable[DateTime])_void.html
- CodeModel.css
- CodeModel.js
- Content.html
- Index.html
- IndexTop.html
- so_CreateToDoItem(int,string,Nullable[DateTime])_ToDoItem.html
- so_DeleteToDoItem(int)_void.html
- so_FindUserByName(string)_User.html
- so_GetUser(int)_User.html
- so_ListAllUsers()_List[User].html
- so_ListDoneItemsForUser(int)_List[ToDoItem].html
- so_ListToDoItemsForUser(int)_List[ToDoItem].html
- so_ListUsersMatching(string)_List[User].html
- so_MarkToDoItemDone(int)_void.html
- so_UpdateToDoItem(int,string,Nullable[DateTime])_ToDoItem.html
- ui_CreateNewToDoItemClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_DeleteClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_InitializeComponent()_void.html
- ui_MarkDoneClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_RefreshToDoItems()_void.html
- ui_SaveClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_ToDoItemSelected(object,System.Windows.Controls.SelectionChangedEventArgs)_void.html
- ui_UserSelected(object,System.Windows.Controls.SelectionChangedEventArgs)_void.html
- ui_WindowLoaded(object,System.Windows.RoutedEventArgs)_void.html
- SampleApp
- LocalTestRun.testrunconfig
- ToDoApplication
- ToDoContract
- ToDoSample.vsmdi
- ToDoService
- ToDoUnitTests
- StaticCodeAnalyzer
- Arebis.CodeAnalysis.Static
- Arebis.Common
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Arebis.Collections.Generic
{
/// <summary>
/// A DictionaryBag is a dictionary of bags. A dictionary where the key
/// refers to a list of values.
/// </summary>
/// <typeparam name="TKey">Type of the key.</typeparam>
/// <typeparam name="TValue">Type of an individual value.</typeparam>
[Serializable]
public class DictionaryBag<TKey, TValue>
{
private Dictionary<TKey, List<TValue>> innerDictionary;
/// <summary>
/// Constructs a default DictionaryBag.
/// </summary>
public DictionaryBag()
{
this.innerDictionary = new Dictionary<TKey, List<TValue>>();
}
/// <summary>
/// Constructs a DictionaryBag using the given key comparer.
/// </summary>
public DictionaryBag(IEqualityComparer<TKey> comparer)
{
this.innerDictionary = new Dictionary<TKey, List<TValue>>(comparer);
}
/// <summary>
/// Constructs a DictionaryBag as shallow copy of the given
/// original.
/// </summary>
public DictionaryBag(DictionaryBag<TKey, TValue> original)
{
this.innerDictionary = new Dictionary<TKey, List<TValue>>(original.innerDictionary);
}
/// <summary>
/// Adds the given value under the given key.
/// </summary>
public void Add(TKey key, TValue value)
{
List<TValue> valueList;
if (!this.innerDictionary.TryGetValue(key, out valueList))
{
valueList = new List<TValue>();
this.innerDictionary[key] = valueList;
}
valueList.Add(value);
}
/// <summary>
/// Removes all values under the given key.
/// </summary>
public void Remove(TKey key)
{
this.innerDictionary.Remove(key);
}
/// <summary>
/// Removes the given value under the given key.
/// </summary>
public void Remove(TKey key, TValue value)
{
List<TValue> valueList;
if (this.innerDictionary.TryGetValue(key, out valueList))
valueList.Remove(value);
}
/// <summary>
/// Clears the whole DictionaryBag.
/// </summary>
public void Clear()
{
this.innerDictionary.Clear();
}
/// <summary>
/// The number of keys.
/// </summary>
public int KeyCount
{
get { return this.innerDictionary.Count; }
}
/// <summary>
/// The keys.
/// </summary>
public ICollection<TKey> Keys
{
get { return this.innerDictionary.Keys; }
}
/// <summary>
/// Whether the DictionaryBag contains the given key.
/// </summary>
public bool ContainsKey(TKey key)
{
return this.innerDictionary.ContainsKey(key);
}
/// <summary>
/// Collection of values sharing the given key.
/// </summary>
public ICollection<TValue> this[TKey key]
{
get { return this.innerDictionary[key].AsReadOnly(); }
}
/// <summary>
/// All values over all keys.
/// </summary>
public IEnumerable<TValue> AllValues
{
get
{
foreach (KeyValuePair<TKey, List<TValue>> pair in this.innerDictionary)
foreach (TValue value in pair.Value)
yield return value;
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.